From 6a0305cdb8a3d1ceb3038dd701bfc73de5d9a05e Mon Sep 17 00:00:00 2001 From: "Modaboina, Kusumakumari (km583p)" Date: Fri, 1 Mar 2019 15:38:31 -0500 Subject: added skip hpervisor check and other adapterchange Issue-ID: APPC-1378 Change-Id: Ia8db114af1347a9523676034fce56640f523e523 Signed-off-by: Modaboina, Kusumakumari (km583p) --- .../operation/impl/AttachVolumeServer.java | 43 +++++-- .../provider/operation/impl/CreateSnapshot.java | 22 +++- .../operation/impl/DettachVolumeServer.java | 11 ++ .../iaas/provider/operation/impl/RebootServer.java | 38 ++++-- .../provider/operation/impl/RebuildServer.java | 69 ++++++++--- .../iaas/provider/operation/impl/StartServer.java | 127 ++++++++++----------- .../iaas/provider/operation/impl/StopServer.java | 15 ++- 7 files changed, 225 insertions(+), 100 deletions(-) diff --git a/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/AttachVolumeServer.java b/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/AttachVolumeServer.java index ccfcf9dbf..aa3c6c1d6 100644 --- a/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/AttachVolumeServer.java +++ b/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/AttachVolumeServer.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP : APPC * ================================================================================ - * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Copyright (C) 2017 Amdocs * ================================================================================ @@ -57,6 +57,8 @@ import com.att.eelf.configuration.EELFLogger; import com.att.eelf.configuration.EELFManager; import com.att.eelf.i18n.EELFResourceManager; import com.woorea.openstack.base.client.OpenStackBaseException; +import org.apache.commons.lang.StringUtils; +import org.onap.appc.adapter.iaas.provider.operation.common.constants.Property; public class AttachVolumeServer extends ProviderServerOperation { @@ -71,6 +73,10 @@ public class AttachVolumeServer extends ProviderServerOperation { String vmUrl = params.get(ProviderAdapter.PROPERTY_INSTANCE_URL); String volumeId = params.get(ProviderAdapter.VOLUME_ID); String device = params.get(ProviderAdapter.DEVICE); + if (StringUtils.isBlank(device)) { + logger.info("Setting device to null"); + device = null; + } VMURL vm = VMURL.parseURL(vmUrl); Context context; String tenantName = "Unknown";// to be used also in case of exception @@ -81,6 +87,10 @@ public class AttachVolumeServer extends ProviderServerOperation { IdentityURL ident = IdentityURL.parseURL(params.get(ProviderAdapter.PROPERTY_IDENTITY_URL)); String identStr = (ident == null) ? null : ident.toString(); context = getContext(requestContext, vmUrl, identStr); + String skipHypervisorCheck = configuration.getProperty(Property.SKIP_HYPERVISOR_CHECK); + if (skipHypervisorCheck == null && ctx != null) { + skipHypervisorCheck = ctx.getAttribute(ProviderAdapter.SKIP_HYPERVISOR_CHECK); + } if (context != null) { tenantName = context.getTenantName();// this variable also is // used in case of @@ -89,6 +99,10 @@ public class AttachVolumeServer extends ProviderServerOperation { server = lookupServer(requestContext, context, vm.getServerId()); logger.debug(Msg.SERVER_FOUND, vmUrl, context.getTenantName(), server.getStatus().toString()); Context contx = server.getContext(); + if (!"true".equalsIgnoreCase(skipHypervisorCheck)) { + // Check of the Hypervisor for the VM Server is UP and reachable + checkHypervisor(server); + } ComputeService service = contx.getComputeService(); if ((volumeId == null || volumeId.isEmpty()) || (device == null || device.isEmpty())) { ctx.setAttribute("VOLUME_STATUS", "FAILURE"); @@ -165,14 +179,19 @@ public class AttachVolumeServer extends ProviderServerOperation { Map.Entry volumes = (Map.Entry) it.next(); if (map != null && !(map.isEmpty())) { logger.info("volumes available before attach"); - logger.info("device" + volumes.getKey() + "Values" + volumes.getValue()); - if (volumes.getKey().equals(device) && (volumes.getValue().equals(volumeId))) { - logger.info("Device " + volumes.getKey() + "Volumes" + volumes.getValue()); + logger.info("device" + volumes.getKey() + " Values " + volumes.getValue()); + if (StringUtils.isBlank(device)) { + if (volumes.getValue().equals(volumeId)) { + logger.info("Device " + volumes.getKey() + " Volumes " + volumes.getValue()); + isValid = true; + } + } else if (volumes.getKey().equals(device) && (volumes.getValue().equals(volumeId))) { + logger.info("Device " + volumes.getKey() + " Volumes " + volumes.getValue()); isValid = true; } } } - logger.info("AttachVolumeFlag" + isValid); + logger.info("AttachVolumeFlag " + isValid); return isValid; } @@ -189,15 +208,21 @@ public class AttachVolumeServer extends ProviderServerOperation { logger.info("volumes available after attach "); while (it.hasNext()) { Map.Entry volumes = (Map.Entry) it.next(); - logger.info(" devices " + volumes.getKey() + "volumes" + volumes.getValue()); - if (volumes.getKey().equals(device) && (volumes.getValue().equals(volumeId))) { - logger.info("Device" + volumes.getKey() + "Volume" + volumes.getValue()); + logger.info(" devices " + volumes.getKey() + " volumes " + volumes.getValue()); + if (StringUtils.isBlank(device)) { + if (volumes.getValue().equals(volumeId)) { + logger.info("Device " + volumes.getKey() + "Volumes " + volumes.getValue()); + isValid = true; + break; + } + } else if (volumes.getKey().equals(device) && (volumes.getValue().equals(volumeId))) { + logger.info("Device " + volumes.getKey() + " Volume " + volumes.getValue()); isValid = true; break; } } if (isValid) { - logger.info("AttachVolume" + rc.getAttempts() + "No.of attempts"); + logger.info("AttachVolume " + rc.getAttempts() + " No.of attempts "); break; } else { rc.delay(); diff --git a/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/CreateSnapshot.java b/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/CreateSnapshot.java index fe08e1856..909f31fd1 100644 --- a/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/CreateSnapshot.java +++ b/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/CreateSnapshot.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP : APPC * ================================================================================ - * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Copyright (C) 2017 Amdocs * ============================================================================= @@ -60,6 +60,7 @@ import java.util.Date; import java.util.Map; import static org.onap.appc.adapter.iaas.provider.operation.common.constants.Constants.DATE_FORMAT; import static org.onap.appc.adapter.utils.Constants.ADAPTER_NAME; +import org.onap.appc.adapter.iaas.provider.operation.common.constants.Property; public class CreateSnapshot extends ProviderServerOperation { @@ -107,7 +108,8 @@ public class CreateSnapshot extends ProviderServerOperation { throw new RequestFailedException("Stop Server", msg, HttpStatus.BAD_GATEWAY_502, server); } rc.reset(); - // Locate snapshot image - image names containing colon must be prefixed by in: and surrounded with quotes + // Locate snapshot image - image names containing colon must be prefixed by in: + // and surrounded with quotes Image snapshot = null; while (rc.attempt()) { try { @@ -152,7 +154,7 @@ public class CreateSnapshot extends ProviderServerOperation { return null; IdentityURL ident = IdentityURL.parseURL(params.get(ProviderAdapter.PROPERTY_IDENTITY_URL)); String identStr = (ident == null) ? null : ident.toString(); - snapshot = createSnapshotNested(snapshot, rc, vm, vm_url, identStr); + snapshot = createSnapshotNested(snapshot, rc, vm, vm_url, identStr,ctx); } catch (RequestFailedException e) { doFailure(rc, e.getStatus(), e.getMessage()); } @@ -160,7 +162,7 @@ public class CreateSnapshot extends ProviderServerOperation { } private Image createSnapshotNested(Image SnapShot, RequestContext RcContext, VMURL vm, String vmUrl, - String identStr) throws APPCException { + String identStr, SvcLogicContext ctx) throws APPCException { String msg; Context context = null; String tenantName = "Unknown";// this variable is also used in catch @@ -169,6 +171,18 @@ public class CreateSnapshot extends ProviderServerOperation { if (context != null) { tenantName = context.getTenantName(); Server server = lookupServer(RcContext, context, vm.getServerId()); + // Is the skip Hypervisor check attribute populated? + String skipHypervisorCheck = configuration.getProperty(Property.SKIP_HYPERVISOR_CHECK); + if (skipHypervisorCheck == null && ctx != null) { + skipHypervisorCheck = ctx.getAttribute(ProviderAdapter.SKIP_HYPERVISOR_CHECK); + } + // Always perform Hypervisor check + // unless the skip is set to true + if (skipHypervisorCheck == null || (!skipHypervisorCheck.equalsIgnoreCase("true"))) { + // Check of the Hypervisor for the VM Server is UP and reachable + checkHypervisor(server); + } + logger.debug(Msg.SERVER_FOUND, vmUrl, tenantName, server.getStatus().toString()); if (hasImageAccess(RcContext, context)) { SnapShot = createSnapshot(RcContext, server); diff --git a/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/DettachVolumeServer.java b/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/DettachVolumeServer.java index a9014a066..0f79d64bd 100644 --- a/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/DettachVolumeServer.java +++ b/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/DettachVolumeServer.java @@ -56,6 +56,7 @@ import com.att.cdp.openstack.util.ExceptionMapper; import org.onap.appc.i18n.Msg; import com.woorea.openstack.base.client.OpenStackBaseException; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; +import org.onap.appc.adapter.iaas.provider.operation.common.constants.Property; public class DettachVolumeServer extends ProviderServerOperation { private final EELFLogger logger = EELFManager.getInstance().getLogger(DettachVolumeServer.class); @@ -86,12 +87,22 @@ public class DettachVolumeServer extends ProviderServerOperation { IdentityURL ident = IdentityURL.parseURL(params.get(ProviderAdapter.PROPERTY_IDENTITY_URL)); String identStr = (ident == null) ? null : ident.toString(); context = getContext(requestContext, vmUrl, identStr); + String skipHypervisorCheck = configuration.getProperty(Property.SKIP_HYPERVISOR_CHECK); + if (skipHypervisorCheck == null && ctx != null) { + skipHypervisorCheck = ctx.getAttribute(ProviderAdapter.SKIP_HYPERVISOR_CHECK); + } if (context != null) { tenantName = context.getTenantName();// this variable also is // used in case of // exception requestContext.reset(); server = lookupServer(requestContext, context, vm.getServerId()); + // Always perform Hypervisor check + // unless the skip is set to true + if (!"true".equalsIgnoreCase(skipHypervisorCheck)) { + // Check of the Hypervisor for the VM Server is UP and reachable + checkHypervisor(server); + } logger.debug(Msg.SERVER_FOUND, vmUrl, context.getTenantName(), server.getStatus().toString()); if (volumeId == null || volumeId.isEmpty()) { ctx.setAttribute("VOLUME_STATUS", "FAILURE"); diff --git a/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/RebootServer.java b/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/RebootServer.java index b6cf8cc58..363f61455 100644 --- a/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/RebootServer.java +++ b/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/RebootServer.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP : APPC * ================================================================================ - * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Copyright (C) 2017 Amdocs * ================================================================================ @@ -50,12 +50,15 @@ import com.att.cdp.zones.model.Server; import com.att.eelf.configuration.EELFLogger; import com.att.eelf.configuration.EELFManager; import com.att.eelf.i18n.EELFResourceManager; +import static org.onap.appc.adapter.iaas.provider.operation.common.enums.Operation.REBOOT_SERVICE; +import org.onap.appc.adapter.iaas.provider.operation.common.constants.Property; public class RebootServer extends ProviderServerOperation { private final EELFLogger logger = EELFManager.getInstance().getLogger(RebootServer.class); private static final Configuration config = ConfigurationFactory.getConfiguration(); - private static final Integer NO_OF_ATTEMPTS=30; - private static final Integer RETRY_INTERVAL=10; + private static final Integer NO_OF_ATTEMPTS = 30; + private static final Integer RETRY_INTERVAL = 10; + private static final int MILLI_SECONDS = 1000; @Override protected ModelObject executeProviderOperation(Map params, SvcLogicContext context) @@ -72,7 +75,7 @@ public class RebootServer extends ProviderServerOperation { String vmUrl = params.get(ProviderAdapter.PROPERTY_INSTANCE_URL); String rebooType = params.get(ProviderAdapter.REBOOT_TYPE); String tenantName = "Unknown"; - if (rebooType.isEmpty() ) { + if (rebooType.isEmpty()) { rebooType = "SOFT"; } logger.info("reboot type" + rebooType); @@ -86,12 +89,23 @@ public class RebootServer extends ProviderServerOperation { IdentityURL ident = IdentityURL.parseURL(params.get(ProviderAdapter.PROPERTY_IDENTITY_URL)); String identStr = (ident == null) ? null : ident.toString(); context = getContext(requestContext, vmUrl, identStr); + // Is the skip Hypervisor check attribute populated? + String skipHypervisorCheck = configuration.getProperty(Property.SKIP_HYPERVISOR_CHECK); + if (skipHypervisorCheck == null && ctx != null) { + skipHypervisorCheck = ctx.getAttribute(ProviderAdapter.SKIP_HYPERVISOR_CHECK); + } if (context != null) { tenantName = context.getTenantName();// this variable also is // used in case of exception requestContext.reset(); server = lookupServer(requestContext, context, vm.getServerId()); logger.debug(Msg.SERVER_FOUND, vmUrl, context.getTenantName(), server.getStatus().toString()); + // Always perform Hypervisor check + // unless the skip is set to true + if (skipHypervisorCheck == null || (!skipHypervisorCheck.equalsIgnoreCase("true"))) { + // Check of the Hypervisor for the VM Server is UP and reachable + checkHypervisor(server); + } Context contx = server.getContext(); ComputeService service = contx.getComputeService(); logger.info("performing reboot action for " + server.getId() + " rebootype " + rebooType); @@ -108,7 +122,8 @@ public class RebootServer extends ProviderServerOperation { } } catch (ResourceNotFoundException | StateException ex) { - logger.info(ex.getMessage()); + String msg = EELFResourceManager.format(Msg.SERVER_OPERATION_EXCEPTION, ex, ex.getClass().getSimpleName(), + REBOOT_SERVICE.toString(), vmUrl, tenantName); ctx.setAttribute("REBOOT_STATUS", "FAILURE"); if (ex instanceof ResourceNotFoundException) { doFailure(requestContext, HttpStatus.NOT_FOUND_404, ex.getMessage()); @@ -116,7 +131,8 @@ public class RebootServer extends ProviderServerOperation { doFailure(requestContext, HttpStatus.CONFLICT_409, ex.getMessage()); } } catch (Exception ex) { - logger.info(ex.getMessage()); + String msg = EELFResourceManager.format(Msg.SERVER_OPERATION_EXCEPTION, ex, ex.getClass().getSimpleName(), + REBOOT_SERVICE.toString(), vmUrl, tenantName); ctx.setAttribute("REBOOT_STATUS", "FAILURE"); doFailure(requestContext, HttpStatus.INTERNAL_SERVER_ERROR_500, ex.getMessage()); } @@ -133,11 +149,17 @@ public class RebootServer extends ProviderServerOperation { String msg; boolean status = false; while (rc.attempt()) { + if ( Server.Status.ERROR.equals(server.getStatus())) { + msg = "Device status " + Server.Status.ERROR + " cannot proceed further"; + throw new RequestFailedException("Waiting for State Change", msg, HttpStatus.CONFLICT_409, server); + } else { server.waitForStateChange(pollInterval, timeout, desiredStates); - if ((server.getStatus().equals(Server.Status.RUNNING)) || (server.getStatus().equals(Server.Status.READY))) { + if (Server.Status.RUNNING.equals(server.getStatus()) + || Server.Status.READY.equals(server.getStatus())) { status = true; } logger.info(server.getStatus() + " status "); + } if (status) { logger.info("Done Trying " + rc.getAttempts() + " attempts"); break; @@ -145,7 +167,6 @@ public class RebootServer extends ProviderServerOperation { rc.delay(); } } - if (rc.isFailed()) { msg = EELFResourceManager.format(Msg.CONNECTION_FAILED, vmUrl); logger.info("waitForStateChange Failed"); @@ -159,7 +180,6 @@ public class RebootServer extends ProviderServerOperation { logger.error(msg); throw new TimeoutException(msg); } - rc.reset(); logger.info("Reboot server status flag --> " + status); return status; diff --git a/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/RebuildServer.java b/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/RebuildServer.java index 7a6688709..09beb9831 100644 --- a/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/RebuildServer.java +++ b/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/RebuildServer.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP : APPC * ================================================================================ -* Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved. +* Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Copyright (C) 2017 Amdocs * ============================================================================= @@ -11,15 +11,15 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at -* +* * http://www.apache.org/licenses/LICENSE-2.0 -* +* * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. -* +* * ============LICENSE_END========================================================= */ @@ -79,7 +79,7 @@ public class RebuildServer extends ProviderServerOperation { // processing the request" private long rebuildSleepTime = 10L * 1000L; - /* + /** * Rebuild the indicated server with the indicated image. This method assumes * the server has been determined to be in the correct state to do the rebuild. * @@ -179,18 +179,19 @@ public class RebuildServer extends ProviderServerOperation { */ setTimeForMetricsLogger(); String msg; - //Throw error if boot source is unknown + // Throw error if boot source is unknown if (ServerBootSource.UNKNOWN.equals(builtFrom)) { - logger.debug("Boot Source Unknown" ); + logger.debug("Boot Source Unknown"); msg = String.format("Error occured when retrieving server boot source [%s]!!!", server.getId()); logger.error(msg); - generateEvent(rc, false,msg); + generateEvent(rc, false, msg); metricsLogger.error(msg); throw new RequestFailedException("Rebuild Server", msg, HttpStatus.INTERNAL_SERVER_ERROR_500, server); } // Throw exception for non image/snap boot source if (ServerBootSource.VOLUME.equals(builtFrom)) { + logger.debug("Boot Source Not Supported built from bootable volume"); msg = String.format("Rebuilding is currently not supported for servers built from bootable volumes [%s]", server.getId()); generateEvent(rc, false, msg); @@ -242,13 +243,25 @@ public class RebuildServer extends ProviderServerOperation { logger.debug("Exception attempting to pull snapshot-id from the payload: " + e.toString()); } List snapshots = server.getSnapshots(); + ImageService imageService = server.getContext().getImageService(); + List imageList = imageService.listImages(); if (!imageToUse.isEmpty()) { logger.debug("Using snapshot-id " + imageToUse + " for the rebuild request"); + boolean imgFound = validateSnapshotId(imageToUse, snapshots, imageList); + + if (!imgFound) { + logger.debug("Image Snapshot Not Found"); + msg = EELFResourceManager.format(Msg.REBUILD_SERVER_FAILED, server.getName(), server.getId(), + "Invalid Snapshot-Id"); + logger.error(msg); + metricsLogger.error(msg); + throw new RequestFailedException("Rebuild Server", msg, HttpStatus.FORBIDDEN_403, server); + } } else if (snapshots != null && !snapshots.isEmpty()) { + logger.debug("Using snapshot-id when image is Empty" + imageToUse + " for the rebuild request"); imageToUse = snapshots.get(0).getId(); } else { imageToUse = server.getImage(); - ImageService imageService = server.getContext().getImageService(); rc.reset(); try { while (rc.attempt()) { @@ -370,7 +383,6 @@ public class RebuildServer extends ProviderServerOperation { try { validateParametersExist(params, ProviderAdapter.PROPERTY_INSTANCE_URL, ProviderAdapter.PROPERTY_PROVIDER_NAME); - String appName = configuration.getProperty(Constants.PROPERTY_APPLICATION_NAME); String vm_url = params.get(ProviderAdapter.PROPERTY_INSTANCE_URL); VMURL vm = VMURL.parseURL(vm_url); @@ -408,8 +420,7 @@ public class RebuildServer extends ProviderServerOperation { logger.error(ex.getMessage()); ctx.setAttribute("REBUILD_STATUS", "ERROR"); doFailure(rc, HttpStatus.CONFLICT_409, ex.getMessage()); - } - catch (RequestFailedException e) { + } catch (RequestFailedException e) { doFailure(rc, e.getStatus(), e.getMessage()); ctx.setAttribute("REBUILD_STATUS", "ERROR"); } catch (ResourceNotFoundException e) { @@ -427,7 +438,6 @@ public class RebuildServer extends ProviderServerOperation { doFailure(rc, HttpStatus.INTERNAL_SERVER_ERROR_500, msg); } } catch (RequestFailedException e) { - ctx.setAttribute("REBUILD_STATUS", "ERROR"); doFailure(rc, e.getStatus(), e.getMessage()); } @@ -467,4 +477,37 @@ public class RebuildServer extends ProviderServerOperation { public void setRebuildSleepTime(long millis) { this.rebuildSleepTime = millis; } + + private boolean validateSnapshotId(String imageToUse, List snapshotList, List imageList) { + + logger.debug("Validating snapshot-id " + imageToUse + " for the rebuild request from payload"); + boolean imageFound = false; + // If image is empty , the validation si not required . Hence return false. + // Ideally function should not be called with empty image Id + if (imageToUse.isEmpty()) { + return imageFound; + } else { + // The supplied snapshot id can be a snapshot id or an image Id. Check both + // available for the vnf. + // Check against snapshot id list and image list + return findImageExists(snapshotList, imageToUse, "snapshotidList") + || findImageExists(imageList, imageToUse, "imageidList"); + } + } + + boolean findImageExists(List list, String imageToUse, String source) { + boolean imageExists = false; + logger.debug("Available Image-ids from :" + source + "Start\n"); + for (Image img : list) { + String imgId = img.getId(); + logger.debug("Image Id - " + imgId + "\n"); + if (imgId.equals(imageToUse)) { + logger.debug("Image found in available " + source); + imageExists = true; + break; + } + } + return imageExists; + + } } diff --git a/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/StartServer.java b/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/StartServer.java index 6729ab1d6..cdff1673a 100644 --- a/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/StartServer.java +++ b/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/StartServer.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP : APPC * ================================================================================ - * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Copyright (C) 2017 Amdocs * ============================================================================= @@ -45,6 +45,7 @@ import org.glassfish.grizzly.http.util.HttpStatus; import java.util.Map; import static org.onap.appc.adapter.iaas.provider.operation.common.enums.Operation.START_SERVICE; import static org.onap.appc.adapter.utils.Constants.ADAPTER_NAME; +import org.onap.appc.adapter.iaas.provider.operation.common.constants.Property; public class StartServer extends ProviderServerOperation { @@ -59,97 +60,97 @@ public class StartServer extends ProviderServerOperation { Server server = null; RequestContext rc = new RequestContext(ctx); rc.isAlive(); - String appName = configuration.getProperty(Constants.PROPERTY_APPLICATION_NAME); - try { validateParametersExist(params, ProviderAdapter.PROPERTY_INSTANCE_URL, ProviderAdapter.PROPERTY_PROVIDER_NAME); - String vm_url = params.get(ProviderAdapter.PROPERTY_INSTANCE_URL); - VMURL vm = VMURL.parseURL(vm_url); if (validateVM(rc, appName, vm_url, vm)) return null; - IdentityURL ident = IdentityURL.parseURL(params.get(ProviderAdapter.PROPERTY_IDENTITY_URL)); String identStr = (ident == null) ? null : ident.toString(); - Context context = null; - String tenantName = "Unknown";//to be used also in case of exception + String tenantName = "Unknown";// to be used also in case of exception ctx.setAttribute("START_STATUS", "ERROR"); + // Is the skip Hypervisor check attribute populated? + String skipHypervisorCheck = configuration.getProperty(Property.SKIP_HYPERVISOR_CHECK); + if (skipHypervisorCheck == null && ctx != null) { + skipHypervisorCheck = ctx.getAttribute(ProviderAdapter.SKIP_HYPERVISOR_CHECK); + } try { context = getContext(rc, vm_url, identStr); if (context != null) { - tenantName = context.getTenantName();//this varaible also is used in case of exception + tenantName = context.getTenantName();// this varaible also is used in case of exception rc.reset(); server = lookupServer(rc, context, vm.getServerId()); logger.debug(Msg.SERVER_FOUND, vm_url, tenantName, server.getStatus().toString()); + if (skipHypervisorCheck == null || (!skipHypervisorCheck.equalsIgnoreCase("true"))) { + // Check of the Hypervisor for the VM Server is UP and reachable + checkHypervisor(server); + } String msg; - /* * We determine what to do based on the current state of the server */ /* - * Pending is a bit of a special case. If we find the server is in a pending state, then the - * provider is in the process of changing state of the server. So, lets try to wait a little bit and - * see if the state settles down to one we can deal with. If not, then we have to fail the request. + * Pending is a bit of a special case. If we find the server is in a pending + * state, then the provider is in the process of changing state of the server. + * So, lets try to wait a little bit and see if the state settles down to one we + * can deal with. If not, then we have to fail the request. */ if (server.getStatus().equals(Server.Status.PENDING)) { waitForStateChange(rc, server, Server.Status.READY, Server.Status.RUNNING, Server.Status.ERROR, Server.Status.SUSPENDED, Server.Status.PAUSED, Server.Status.DELETED); } - switch (server.getStatus()) { - case DELETED: - // Nothing to do, the server is gone - msg = EELFResourceManager.format(Msg.SERVER_DELETED, server.getName(), server.getId(), - server.getTenantId(), "started"); - logger.error(msg); - throw new RequestFailedException("Start Server", msg, HttpStatus.METHOD_NOT_ALLOWED_405, - server); - - case RUNNING: - // Nothing to do, the server is already running - logger.info("Server was already running"); - break; - - case ERROR: - // Server is in error state - msg = EELFResourceManager.format(Msg.SERVER_ERROR_STATE, server.getName(), server.getId(), - server.getTenantId(), "start"); - logger.error(msg); - throw new RequestFailedException("Start Server", msg, HttpStatus.METHOD_NOT_ALLOWED_405, - server); - - case READY: - // Server is stopped attempt to start the server - rc.reset(); - startServer(rc, server); - break; - - case PAUSED: - // if paused, un-pause it - rc.reset(); - unpauseServer(rc, server); - break; - - case SUSPENDED: - // Attempt to resume the suspended server - rc.reset(); - resumeServer(rc, server); - break; - - default: - // Hmmm, unknown status, should never occur - msg = EELFResourceManager.format(Msg.UNKNOWN_SERVER_STATE, server.getName(), server.getId(), - server.getTenantId(), server.getStatus().name()); - generateEvent(rc, false, msg); - logger.error(msg); - throw new RequestFailedException("Start Server", msg, HttpStatus.METHOD_NOT_ALLOWED_405, - server); + case DELETED: + // Nothing to do, the server is gone + msg = EELFResourceManager.format(Msg.SERVER_DELETED, server.getName(), server.getId(), + server.getTenantId(), "started"); + logger.error(msg); + throw new RequestFailedException("Start Server", msg, HttpStatus.METHOD_NOT_ALLOWED_405, + server); + case RUNNING: + // Nothing to do, the server is already running + logger.info("Server was already running"); + break; + case ERROR: + // Server is in error state + msg = EELFResourceManager.format(Msg.SERVER_ERROR_STATE, server.getName(), server.getId(), + server.getTenantId(), "start"); + logger.error(msg); + throw new RequestFailedException("Start Server", msg, HttpStatus.METHOD_NOT_ALLOWED_405, + server); + + case READY: + // Server is stopped attempt to start the server + rc.reset(); + startServer(rc, server); + break; + + case PAUSED: + // if paused, un-pause it + rc.reset(); + unpauseServer(rc, server); + break; + + case SUSPENDED: + // Attempt to resume the suspended server + rc.reset(); + resumeServer(rc, server); + break; + + default: + // Hmmm, unknown status, should never occur + msg = EELFResourceManager.format(Msg.UNKNOWN_SERVER_STATE, server.getName(), server.getId(), + server.getTenantId(), server.getStatus().name()); + generateEvent(rc, false, msg); + logger.error(msg); + throw new RequestFailedException("Start Server", msg, HttpStatus.METHOD_NOT_ALLOWED_405, + server); } context.close(); doSuccess(rc); @@ -163,15 +164,13 @@ public class StartServer extends ProviderServerOperation { doFailure(rc, HttpStatus.NOT_FOUND_404, msg); } catch (Exception e1) { String msg = EELFResourceManager.format(Msg.SERVER_OPERATION_EXCEPTION, e1, - e1.getClass().getSimpleName(), START_SERVICE.toString(), vm_url, - tenantName); + e1.getClass().getSimpleName(), START_SERVICE.toString(), vm_url, tenantName); logger.error(msg, e1); doFailure(rc, HttpStatus.INTERNAL_SERVER_ERROR_500, msg); } } catch (RequestFailedException e) { doFailure(rc, e.getStatus(), e.getMessage()); } - return server; } diff --git a/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/StopServer.java b/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/StopServer.java index 10236a80b..72b2ba26b 100644 --- a/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/StopServer.java +++ b/appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/StopServer.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP : APPC * ================================================================================ - * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Copyright (C) 2017 Amdocs * ============================================================================= @@ -49,6 +49,7 @@ import java.util.Map; import org.slf4j.MDC; import static org.onap.appc.adapter.iaas.provider.operation.common.enums.Operation.STOP_SERVICE; import static org.onap.appc.adapter.utils.Constants.ADAPTER_NAME; +import org.onap.appc.adapter.iaas.provider.operation.common.constants.Property; public class StopServer extends ProviderServerOperation { @@ -78,12 +79,23 @@ public class StopServer extends ProviderServerOperation { String identStr = (ident == null) ? null : ident.toString(); Context context = null; ctx.setAttribute("STOP_STATUS", "ERROR"); + // Is the skip Hypervisor check attribute populated? + String skipHypervisorCheck = configuration.getProperty(Property.SKIP_HYPERVISOR_CHECK); + if (skipHypervisorCheck == null && ctx != null) { + skipHypervisorCheck = ctx.getAttribute(ProviderAdapter.SKIP_HYPERVISOR_CHECK); + } try { context = getContext(rc, vm_url, identStr); if (context != null) { rc.reset(); server = lookupServer(rc, context, vm.getServerId()); logger.debug(Msg.SERVER_FOUND, vm_url, context.getTenantName(), server.getStatus().toString()); + // Always perform Hypervisor check + // unless the skip is set to true + if (skipHypervisorCheck == null || (!skipHypervisorCheck.equalsIgnoreCase("true"))) { + // Check of the Hypervisor for the VM Server is UP and reachable + checkHypervisor(server); + } String msg; /* * We determine what to do based on the current state of the server @@ -183,6 +195,7 @@ public class StopServer extends ProviderServerOperation { logOperation(Msg.STOPPING_SERVER, params, context); return stopServer(params, context); } + private void setTimeForMetricsLogger() { String timestamp = LoggingUtils.generateTimestampStr(((Date) new Date()).toInstant()); MDC.put(LoggingConstants.MDCKeys.BEGIN_TIMESTAMP, timestamp); -- cgit 1.2.3-korg