public static Capability getScalableCapability(Topology topology, String nodeTemplateId, boolean throwNotFoundException) { NodeTemplate nodeTemplate = throwNotFoundException ? getNodeTemplate(topology, nodeTemplateId) : safe(topology.getNodeTemplates()).get(nodeTemplateId); if (nodeTemplate == null) { return null; } return throwNotFoundException ? NodeTemplateUtils.getCapabilityByTypeOrFail(nodeTemplate, NormativeCapabilityTypes.SCALABLE) : NodeTemplateUtils.getCapabilityByType(nodeTemplate, NormativeCapabilityTypes.SCALABLE); }
private void doScaleNode(final String nodeTemplateId, final int instances, final IPaaSCallback<Object> callback, final Deployment deployment, final DeploymentTopology topology, NodeTemplate nodeTemplate, SecretProviderConfigurationAndCredentials secretProviderConfigurationAndCredentials) { final Capability capability = NodeTemplateUtils.getCapabilityByTypeOrFail(nodeTemplate, NormativeCapabilityTypes.SCALABLE); final int previousInitialInstances = TopologyUtils.getScalingProperty(NormativeComputeConstants.SCALABLE_DEFAULT_INSTANCES, capability); final int newInitialInstances = previousInitialInstances + instances; log.info("Scaling [ {} ] node from [ {} ] to [ {} ]. Updating runtime topology...", nodeTemplateId, previousInitialInstances, newInitialInstances); TopologyUtils.setScalingProperty(NormativeComputeConstants.SCALABLE_DEFAULT_INSTANCES, newInitialInstances, capability); alienMonitorDao.save(topology); IOrchestratorPlugin orchestratorPlugin = orchestratorPluginService.getOrFail(deployment.getOrchestratorId()); PaaSDeploymentContext deploymentContext = new PaaSDeploymentContext(deployment, topology, secretProviderConfigurationAndCredentials); orchestratorPlugin.scale(deploymentContext, nodeTemplateId, instances, new IPaaSCallback() { @Override public void onFailure(Throwable throwable) { log.info("Failed to scale [ {} ] node from [ {} ] to [ {} ]. rolling back to {}...", nodeTemplateId, previousInitialInstances, newInitialInstances, previousInitialInstances); TopologyUtils.setScalingProperty(NormativeComputeConstants.SCALABLE_DEFAULT_INSTANCES, previousInitialInstances, capability); alienMonitorDao.save(topology); callback.onFailure(throwable); } @Override public void onSuccess(Object data) { callback.onSuccess(data); } }); } }
@Test public void getCapabilityByTypeOrFailTest() { NodeTemplate nodeTemplate = new NodeTemplate(); Capability nodeCapability = new Capability("org.alien4cloud.capabilities.SampleCapability", null); nodeTemplate.setCapabilities(Maps.newHashMap("test", nodeCapability)); // if the capability type exactly equals then no tosca context and request is required Capability capability = getCapabilityByTypeOrFail(nodeTemplate, "org.alien4cloud.capabilities.SampleCapability"); assertSame(nodeCapability, capability); // if the capability derives from parent type then a TOSCA context and query is required to fetch the type. CapabilityType capabilityType = new CapabilityType(); capabilityType.setElementId("org.alien4cloud.capabilities.SampleCapability"); capabilityType.setDerivedFrom(Lists.newArrayList("org.alien4cloud.capabilities.TestCapability")); Mockito.reset(csarRepositorySearchService); Mockito.when(csarRepositorySearchService.getElementInDependencies(Mockito.eq(CapabilityType.class), Mockito.eq("org.alien4cloud.capabilities.SampleCapability"), Mockito.any(Set.class))).thenReturn(capabilityType); capability = toscaContextualAspect.execInToscaContext(() -> getCapabilityByTypeOrFail(nodeTemplate, "org.alien4cloud.capabilities.TestCapability"), false, Sets.newHashSet(new CSARDependency("org.alien4cloud.testArchive", "1.0.0-SNAPSHOT"))); assertSame(nodeCapability, capability); }
@Test(expected = NotFoundException.class) public void getMissingCapabilityByTypeOrFailTest() { NodeTemplate nodeTemplate = new NodeTemplate(); Capability nodeCapability = new Capability("org.alien4cloud.capabilities.SampleCapability", null); nodeTemplate.setCapabilities(Maps.newHashMap("test", nodeCapability)); // if the capability derives from parent type then a TOSCA context and query is required to fetch the type. CapabilityType capabilityType = new CapabilityType(); capabilityType.setElementId("org.alien4cloud.capabilities.SampleCapability"); capabilityType.setDerivedFrom(Lists.newArrayList("org.alien4cloud.capabilities.TestCapability")); Mockito.reset(csarRepositorySearchService); Mockito.when(csarRepositorySearchService.getElementInDependencies(Mockito.eq(CapabilityType.class), Mockito.eq("org.alien4cloud.capabilities.SampleCapability"), Mockito.any(Set.class))).thenReturn(capabilityType); Capability capability = toscaContextualAspect.execInToscaContext(() -> getCapabilityByTypeOrFail(nodeTemplate, "org.alien4cloud.capabilities.Unknown"), false, Sets.newHashSet(new CSARDependency("org.alien4cloud.testArchive", "1.0.0-SNAPSHOT"))); assertNull(capability); } }