added skip hpervisor check and other adapterchange 82/79482/7
authorModaboina, Kusumakumari (km583p) <km583p@us.att.com>
Fri, 1 Mar 2019 20:38:31 +0000 (15:38 -0500)
committerPatrick Brady <patrick.brady@att.com>
Tue, 5 Mar 2019 22:38:01 +0000 (22:38 +0000)
Issue-ID: APPC-1378
Change-Id: Ia8db114af1347a9523676034fce56640f523e523
Signed-off-by: Modaboina, Kusumakumari (km583p) <km583p@us.att.com>
appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/AttachVolumeServer.java
appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/CreateSnapshot.java
appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/DettachVolumeServer.java
appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/RebootServer.java
appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/RebuildServer.java
appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/StartServer.java
appc-adapters/appc-iaas-adapter/appc-iaas-adapter-bundle/src/main/java/org/onap/appc/adapter/iaas/provider/operation/impl/StopServer.java

index ccfcf9d..aa3c6c1 100644 (file)
@@ -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();
index fe08e18..909f31f 100644 (file)
@@ -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);
index a9014a0..0f79d64 100644 (file)
@@ -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");
index b6cf8cc..363f614 100644 (file)
@@ -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<String, String> 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;
index 7a66887..09beb98 100644 (file)
@@ -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
 * =============================================================================
 * 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<Image> snapshots = server.getSnapshots();
+        ImageService imageService = server.getContext().getImageService();
+        List<Image> 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<Image> snapshotList, List<Image> 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<Image> 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;
+
+    }
 }
index 6729ab1..cdff167 100644 (file)
@@ -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;
     }
 
index 10236a8..72b2ba2 100644 (file)
@@ -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);