private void removeResources(ClusteringTaskState state, String descLink, List<ResourceState> resourcesToRemove) { RequestBrokerState requestBrokerState = new RequestBrokerState(); requestBrokerState.resourceType = state.resourceType; requestBrokerState.operation = RequestBrokerState.REMOVE_RESOURCE_OPERATION; requestBrokerState.tenantLinks = state.tenantLinks; requestBrokerState.resourceDescriptionLink = descLink; requestBrokerState.resourceLinks = resourcesToRemove.stream().map(c -> c.documentSelfLink) .collect(Collectors.toSet()); requestBrokerState.requestTrackerLink = state.requestTrackerLink; requestBrokerState.serviceTaskCallback = ServiceTaskCallback.create(getSelfLink(), TaskState.TaskStage.STARTED, SubStage.COMPLETED, TaskState.TaskStage.FAILED, SubStage.ERROR); requestBrokerState.addCustomProperty(FIELD_NAME_CONTEXT_ID_KEY, state.contextId); requestBrokerState.addCustomProperty(RequestUtils.CLUSTERING_OPERATION_CUSTOM_PROP, Boolean.TRUE.toString()); sendRequest(Operation.createPost(this, RequestBrokerFactoryService.SELF_LINK) .setBody(requestBrokerState).setCompletion((o, e) -> { if (e != null) { logSevere(e); return; } proceedTo(SubStage.CLUSTERING); })); }
private void sendClusterRequest(ContainerRedeploymentTaskState state) { String cdLink = state.containerDescriptionLink; String contextId = state.contextId; int clusterSize = state.desiredClusterSize; logFine("Cluster container with %s description link, from %s context_id with cluster " + "size: %s", cdLink, contextId, clusterSize); RequestBrokerState rbState = new RequestBrokerState(); rbState.resourceDescriptionLink = cdLink; rbState.resourceCount = clusterSize; rbState.customProperties = new HashMap<>(); rbState.customProperties.put(RequestUtils.FIELD_NAME_CONTEXT_ID_KEY, contextId); rbState.resourceType = ComputeType.DOCKER_CONTAINER.name().toString(); rbState.operation = RequestBrokerState.CLUSTER_RESOURCE_OPERATION; rbState.tenantLinks = state.tenantLinks; rbState.serviceTaskCallback = ServiceTaskCallback.create(getSelfLink(), TaskStage.STARTED, SubStage.COMPLETED, TaskStage.STARTED, SubStage.ERROR); sendRequest(Operation.createPost(this, RequestBrokerFactoryService.SELF_LINK) .setBody(rbState) .setCompletion((o, e) -> { if (e != null) { logSevere(e); return; } })); }
@Test public void testRequestBrokerContainerHostRemovalWithKubernetesResources() throws Throwable { computeHost.customProperties.put(ContainerHostService.CONTAINER_HOST_TYPE_PROP_NAME, ContainerHostType.KUBERNETES.name()); computeHost = doPatch(computeHost, computeHost.documentSelfLink); PodState podState = new PodState(); podState.parentLink = computeHost.documentSelfLink; podState = doPost(podState, PodFactoryService.SELF_LINK); ServiceState serviceState = new ServiceState(); serviceState.parentLink = computeHost.documentSelfLink; serviceState = doPost(serviceState, ServiceEntityFactoryHandler.SELF_LINK); RequestBrokerState request = new RequestBrokerState(); request.resourceType = ResourceType.CONTAINER_HOST_TYPE.getName(); request.resourceLinks = new HashSet<>(Collections.singletonList( computeHost.documentSelfLink)); request.operation = RequestBrokerState.REMOVE_RESOURCE_OPERATION; request = startRequest(request); waitForRequestToComplete(request); List<String> podStateLinks = findResourceLinks(PodState.class, Collections.singletonList(podState.documentSelfLink)); assertTrue("PodState links not removed: " + podStateLinks, podStateLinks.isEmpty()); List<String> serviceStateLinks = findResourceLinks(ServiceState.class, Collections.singletonList(serviceState.documentSelfLink)); assertTrue("ServiceState links not removed: " + serviceStateLinks, serviceStateLinks.isEmpty()); Collection<String> computeSelfLinks = findResourceLinks(ComputeState.class, Collections.singletonList(computeHost.documentSelfLink)); assertTrue("ComputeState was not deleted: " + computeSelfLinks, computeSelfLinks.isEmpty()); }
@Test public void testContainerResourceOperationCycle() throws Throwable { host.log("######## testContainerResourceOperationCycle ######## "); request = startRequest(request); waitForRequestToComplete(request); request = getDocument(RequestBrokerState.class, request.documentSelfLink); assertNotNull(request); assertNotNull(request.documentSelfLink); // verify the resources are created as expected: assertNotNull("Request resourceLinks null for requestId: " + request.documentSelfLink, request.resourceLinks); assertEquals(request.resourceCount, request.resourceLinks.size()); host.log("wait for containers to be in running state for request: " + request.documentSelfLink); waitForContainerPowerState(PowerState.RUNNING, request.resourceLinks); RequestBrokerState day2StopRequest = new RequestBrokerState(); day2StopRequest.resourceType = request.resourceType; day2StopRequest.resourceLinks = request.resourceLinks; day2StopRequest.operation = ContainerOperationType.STOP.id; day2StopRequest = startRequest(day2StopRequest); String containerOperationTaskLink = UriUtils.buildUriPath( ContainerOperationTaskFactoryService.SELF_LINK, extractId(day2StopRequest.documentSelfLink)); waitForTaskSuccess(containerOperationTaskLink, ContainerOperationTaskState.class); waitForRequestToComplete(day2StopRequest); // verify the resources have been stopped: waitForContainerPowerState(PowerState.STOPPED, request.resourceLinks); }
@Test public void testClusteredContainerAllocationWithFollowingProvisioningRequestWithHeathCheckIncludedShoudFail() throws Throwable { host.log(">>>>>>Start: testClusteredContainerAllocationWithFollowingProvisioningRequestWithHeathCheckIncludedShoudFail <<<<< "); final int clusterSize = 5; containerDesc.healthConfig = createHealthConfigTcp(2); containerDesc.healthConfig.ignoreOnProvision = false; containerDesc._cluster = clusterSize; doOperation(containerDesc, UriUtils.buildUri(host, containerDesc.documentSelfLink), false, Action.PUT); ContainerAllocationTaskState allocationTask = createContainerAllocationTask(containerDesc.documentSelfLink, clusterSize); allocationTask.customProperties = new HashMap<>(); allocationTask.customProperties.put(RequestUtils.FIELD_NAME_ALLOCATION_REQUEST, Boolean.TRUE.toString()); allocationTask = allocate(allocationTask); assertContainerStateAfterAllocation(allocationTask); configureHealthCheckTimeout(DEFAULT_HEALTH_CHECK_TIMEOUT); configureHealthCheckDelay(DEFAULT_HEALTH_CHECK_DELAY); // Request provisioning after allocation: RequestBrokerState provisioningRequest = new RequestBrokerState(); provisioningRequest.resourceType = allocationTask.resourceType; provisioningRequest.resourceLinks = allocationTask.resourceLinks; provisioningRequest.resourceCount = clusterSize; provisioningRequest.resourceDescriptionLink = containerDesc.documentSelfLink; provisioningRequest.operation = ContainerOperationType.CREATE.id; // should fail because there is no listener to handle the health check request provisioningRequest = doPost(provisioningRequest, RequestBrokerFactoryService.SELF_LINK); assertNotNull(provisioningRequest); waitForRequestToFail(provisioningRequest); }
@Test public void testRequestBrokerContainerHostRemovalWithSystemContainer() throws Throwable { request = startRequest(request); waitForRequestToComplete(request); request = getDocument(RequestBrokerState.class, request.documentSelfLink); assertNotNull(request); // create a system container ContainerState container = TestRequestStateFactory.createContainer(); container.descriptionLink = containerDesc.documentSelfLink; container.adapterManagementReference = containerDesc.instanceAdapterReference; container.groupResourcePlacementLink = groupPlacementState.documentSelfLink; container.parentLink = computeHost.documentSelfLink; container.system = Boolean.TRUE; container = doPost(container, ContainerFactoryService.SELF_LINK); // verify the resources are created as expected: assertEquals(request.resourceCount, request.resourceLinks.size()); List<String> containerStateLinks = findResourceLinks(ContainerState.class, request.resourceLinks); // create a host removal task - RequestBroker RequestBrokerState request = new RequestBrokerState(); request.resourceType = ResourceType.CONTAINER_HOST_TYPE.getName(); request.resourceLinks = new HashSet<>(Collections.singletonList( computeHost.documentSelfLink)); request.operation = RequestBrokerState.REMOVE_RESOURCE_OPERATION; request = startRequest(request); waitForRequestToComplete(request); validateHostRemoved(containerStateLinks); }
@Test public void testContainerAllocationWithFollowingProvisioningRequestWithHeathCheckIncludedShouldFail() throws Throwable { host.log(">>>>>>Start: testContainerAllocationWithFollowingProvisioningRequestWithHeathCheckIncludedShouldFail <<<<< "); containerDesc.healthConfig = createHealthConfigTcp(2); containerDesc.healthConfig.ignoreOnProvision = false; doOperation(containerDesc, UriUtils.buildUri(host, containerDesc.documentSelfLink), false, Action.PUT); ContainerAllocationTaskState allocationTask = createContainerAllocationTask(); allocationTask.customProperties = new HashMap<>(); allocationTask.customProperties.put(RequestUtils.FIELD_NAME_ALLOCATION_REQUEST, Boolean.TRUE.toString()); allocationTask = allocate(allocationTask); assertContainerStateAfterAllocation(allocationTask); // Request provisioning after allocation: RequestBrokerState provisioningRequest = new RequestBrokerState(); provisioningRequest.resourceType = allocationTask.resourceType; provisioningRequest.resourceLinks = allocationTask.resourceLinks; provisioningRequest.resourceDescriptionLink = containerDesc.documentSelfLink; provisioningRequest.operation = ContainerOperationType.CREATE.id; configureHealthCheckTimeout(DEFAULT_HEALTH_CHECK_TIMEOUT); configureHealthCheckDelay(DEFAULT_HEALTH_CHECK_DELAY); // should fail because there is no listener to handle the health check request provisioningRequest = doPost(provisioningRequest, RequestBrokerFactoryService.SELF_LINK); assertNotNull(provisioningRequest); waitForRequestToFail(provisioningRequest); }
@Test public void testContainerRemoveOperationAdapterNotAvailable() throws Throwable { ContainerState container = TestRequestStateFactory.createContainer(); container.id = "test"; container.descriptionLink = containerDesc.documentSelfLink; container.adapterManagementReference = containerDesc.instanceAdapterReference; container.groupResourcePlacementLink = groupPlacementState.documentSelfLink; container = doPost(container, ContainerFactoryService.SELF_LINK); List<String> containerStateLinks = new ArrayList<>(1); containerStateLinks.add(container.documentSelfLink); RequestBrokerState removalRequest = new RequestBrokerState(); removalRequest.documentSelfLink = extractId(container.documentSelfLink) + "-removal"; removalRequest.resourceType = request.resourceType; removalRequest.resourceLinks = new HashSet<>(containerStateLinks); removalRequest.operation = ContainerOperationType.DELETE.id; // stop the adapter service // verify the container have not been removed: MockAdapterService mockAdapterService = new MockAdapterService(); mockAdapterService.setSelfLink(MockAdapterService.SELF_LINK); stopService(mockAdapterService); removalRequest = startRequest(removalRequest); waitForRequestToFail(removalRequest); containerStateLinks = findResourceLinks(ContainerState.class, containerStateLinks); assertTrue("Container should not be removed.", !containerStateLinks.isEmpty()); }
@Test public void testContainerAllocationWithFollowingProvisioningRequestWithHeathCheckIncludedWhichFailsContinueProvisioning() throws Throwable { host.log(">>>>>>Start: testContainerAllocationWithFollowingProvisioningRequestWithHeathCheckIncludedWhichFailsContinueProvisioning <<<<< "); containerDesc.healthConfig = createHealthConfigTcp(2); doOperation(containerDesc, UriUtils.buildUri(host, containerDesc.documentSelfLink), false, Action.PUT); ContainerAllocationTaskState allocationTask = createContainerAllocationTask(); allocationTask.customProperties = new HashMap<>(); allocationTask.customProperties.put(RequestUtils.FIELD_NAME_ALLOCATION_REQUEST, Boolean.TRUE.toString()); allocationTask = allocate(allocationTask); assertContainerStateAfterAllocation(allocationTask); // Request provisioning after allocation: RequestBrokerState provisioningRequest = new RequestBrokerState(); provisioningRequest.resourceType = allocationTask.resourceType; provisioningRequest.resourceLinks = allocationTask.resourceLinks; provisioningRequest.resourceDescriptionLink = containerDesc.documentSelfLink; provisioningRequest.operation = ContainerOperationType.CREATE.id; configureHealthCheckTimeout(DEFAULT_HEALTH_CHECK_TIMEOUT); configureHealthCheckDelay(DEFAULT_HEALTH_CHECK_DELAY); // should fail because there is no listener to handle the health check request provisioningRequest = doPost(provisioningRequest, RequestBrokerFactoryService.SELF_LINK); assertNotNull(provisioningRequest); waitForRequestToComplete(provisioningRequest); }
@Override public void removeContainer(String containerLink, Consumer<Throwable> errorHandler) { logInfo("Removing container state with self link: %s", containerLink); RequestBrokerState removeRequest = new RequestBrokerState(); removeRequest.resourceType = ResourceType.CONTAINER_TYPE.getName(); removeRequest.resourceLinks = new HashSet<>(); removeRequest.resourceLinks.add(containerLink); removeRequest.operation = ContainerOperationType.DELETE.id; getHost().sendRequest( Operation.createPost(getHost(), RequestBrokerFactoryService.SELF_LINK) .setBody(removeRequest) .setReferer(getHost().getUri()) .setCompletion((o, e) -> { if (e != null) { logError("Exception while submitting remove container request: %s", Utils.toString(e)); errorHandler.accept(e); return; } // should be only one logInfo("Container removed successfully: %s", containerLink); })); logInfo("Removal request of execution container has been sent."); }
@Test public void testSystemContainerRemoveOperationWithId() throws Throwable { ContainerState container = TestRequestStateFactory.createContainer(); container.id = "systemContainer"; container.descriptionLink = containerDesc.documentSelfLink; container.adapterManagementReference = containerDesc.instanceAdapterReference; container.groupResourcePlacementLink = groupPlacementState.documentSelfLink; container.system = Boolean.TRUE; container = doPost(container, ContainerFactoryService.SELF_LINK); // try to delete system container List<String> containerStateLinks = new ArrayList<>(1); containerStateLinks.add(container.documentSelfLink); RequestBrokerState removalRequest = new RequestBrokerState(); removalRequest.documentSelfLink = extractId(container.documentSelfLink) + "-removal"; removalRequest.resourceType = request.resourceType; removalRequest.resourceLinks = new HashSet<>(containerStateLinks); removalRequest.operation = ContainerOperationType.DELETE.id; removalRequest = startRequest(removalRequest); waitForRequestToComplete(removalRequest); // verify the system container have not been removed: containerStateLinks = findResourceLinks(ContainerState.class, containerStateLinks); assertTrue("System container should not be removed.", !containerStateLinks.isEmpty()); }
@Test public void testSystemContainerRemoveOperation() throws Throwable { ContainerState container = TestRequestStateFactory.createContainer(); container.descriptionLink = containerDesc.documentSelfLink; container.adapterManagementReference = containerDesc.instanceAdapterReference; container.groupResourcePlacementLink = groupPlacementState.documentSelfLink; container.system = Boolean.TRUE; container = doPost(container, ContainerFactoryService.SELF_LINK); // try to delete system container List<String> containerStateLinks = new ArrayList<>(1); containerStateLinks.add(container.documentSelfLink); RequestBrokerState removalRequest = new RequestBrokerState(); removalRequest.documentSelfLink = extractId(container.documentSelfLink) + "-removal"; removalRequest.resourceType = request.resourceType; removalRequest.resourceLinks = new HashSet<>(containerStateLinks); removalRequest.operation = ContainerOperationType.DELETE.id; removalRequest = startRequest(removalRequest); waitForRequestToComplete(removalRequest); // verify the system container have not been removed: containerStateLinks = findResourceLinks(ContainerState.class, containerStateLinks); assertTrue("System container should not be removed.", !containerStateLinks.isEmpty()); }
@Test public void testContainerStateShouldBeRemovedAfterFailure() throws Throwable { // Create docker hosts ResourcePoolState resourcePool = createResourcePool(); // try to deploy a container ContainerDescription containerDescription = createContainerDescription(); GroupResourcePlacementState groupPlacementState = createGroupResourcePlacement( resourcePool); // stop the adapter service MockDockerAdapterService service = new MockDockerAdapterService(); service.setSelfLink(MockDockerAdapterService.SELF_LINK); host.stopService(service); RequestBrokerState request = new RequestBrokerState(); request.resourceType = ResourceType.CONTAINER_TYPE.getName(); request.resourceDescriptionLink = containerDescription.documentSelfLink; request.tenantLinks = groupPlacementState.tenantLinks; request = startRequest(request); request = waitForRequestToFail(request); ContainerState containerState = searchForDocument(ContainerState.class, request.resourceLinks.iterator().next()); assertNull(containerState); }
private void removeResources(ContainerRedeploymentTaskState state) { RequestBrokerState requestBrokerState = new RequestBrokerState(); requestBrokerState.resourceType = ComputeType.DOCKER_CONTAINER.name().toString(); requestBrokerState.operation = RequestBrokerState.REMOVE_RESOURCE_OPERATION; requestBrokerState.tenantLinks = state.tenantLinks; requestBrokerState.resourceDescriptionLink = state.containerDescriptionLink; requestBrokerState.resourceLinks = state.containerStateLinks; requestBrokerState.requestTrackerLink = state.requestTrackerLink; requestBrokerState.serviceTaskCallback = ServiceTaskCallback.create(getSelfLink(), TaskStage.STARTED, SubStage.CLUSTER, TaskStage.FAILED, SubStage.ERROR); requestBrokerState.addCustomProperty(FIELD_NAME_CONTEXT_ID_KEY, state.contextId); requestBrokerState.addCustomProperty(CONTAINER_REDEPLOYMENT_CUSTOM_PROP, "container_redeployment"); sendRequest(Operation.createPost(this, RequestBrokerFactoryService.SELF_LINK) .setBody(requestBrokerState).setCompletion((o, e) -> { if (e != null) { logSevere(e); return; } })); }
@Test public void testContainerAllocationWithFollowingProvisioningRequest() throws Throwable { host.log(">>>>>>Start: testContainerAllocationWithFollowingProvisioningRequest <<<<< "); doOperation(containerDesc, UriUtils.buildUri(host, containerDesc.documentSelfLink), false, Action.PUT); ContainerAllocationTaskState allocationTask = createContainerAllocationTask(); allocationTask.customProperties = new HashMap<>(); allocationTask.customProperties.put(RequestUtils.FIELD_NAME_ALLOCATION_REQUEST, Boolean.TRUE.toString()); allocationTask = allocate(allocationTask); assertContainerStateAfterAllocation(allocationTask); // Request provisioning after allocation: RequestBrokerState provisioningRequest = new RequestBrokerState(); provisioningRequest.resourceType = allocationTask.resourceType; provisioningRequest.resourceLinks = allocationTask.resourceLinks; provisioningRequest.resourceDescriptionLink = containerDesc.documentSelfLink; provisioningRequest.operation = ContainerOperationType.CREATE.id; provisioningRequest = doPost(provisioningRequest, RequestBrokerFactoryService.SELF_LINK); assertNotNull(provisioningRequest); waitForTaskSuccess(allocationTask.documentSelfLink, ContainerAllocationTaskState.class); }
@Test public void testRemoveCompositeComponentsWithContainers() throws Throwable { CompositeComponent composite1 = createCompositeComponent(); ContainerState container1 = createContainer(composite1); ContainerState container2 = createContainer(composite1); CompositeComponent composite2 = createCompositeComponent(); ContainerState container3 = createContainer(composite2); RequestBrokerState day2RemovalRequest = new RequestBrokerState(); day2RemovalRequest.resourceType = ResourceType.COMPOSITE_COMPONENT_TYPE.getName(); day2RemovalRequest.resourceLinks = new HashSet<>(Arrays.asList( composite1.documentSelfLink, composite2.documentSelfLink)); day2RemovalRequest.operation = ContainerOperationType.DELETE.id; day2RemovalRequest = startRequest(day2RemovalRequest); waitForRequestToComplete(day2RemovalRequest); // verify the CompositeComponents has been removed verifyRemoved(composite1); verifyRemoved(container1); verifyRemoved(container2); verifyRemoved(composite2); verifyRemoved(container3); }
@Test public void testRequestBrokerContainerHostRemovalResourceOperationCycle() throws Throwable { request = startRequest(request); waitForRequestToComplete(request); request = getDocument(RequestBrokerState.class, request.documentSelfLink); assertNotNull(request); // verify the resources are created as expected: assertEquals(request.resourceCount, request.resourceLinks.size()); List<String> containerStateLinks = findResourceLinks(ContainerState.class, request.resourceLinks); // create a host removal task - RequestBroker RequestBrokerState request = new RequestBrokerState(); request.resourceType = ResourceType.CONTAINER_HOST_TYPE.getName(); request.resourceLinks = new HashSet<>(Collections.singletonList( computeHost.documentSelfLink)); request.operation = RequestBrokerState.REMOVE_RESOURCE_OPERATION; request = startRequest(request); waitForRequestToComplete(request); validateHostRemoved(containerStateLinks); }
@Test public void testRemoveCompositeComponentsWithExternalNetwork() throws Throwable { CompositeComponent composite1 = createCompositeComponent(); ContainerState container1 = createContainer(composite1); ContainerNetworkState network = createNetwork(composite1, true); RequestBrokerState day2RemovalRequest = new RequestBrokerState(); day2RemovalRequest.resourceType = ResourceType.COMPOSITE_COMPONENT_TYPE.getName(); day2RemovalRequest.resourceLinks = new HashSet<>( Arrays.asList(composite1.documentSelfLink)); day2RemovalRequest.operation = ContainerOperationType.DELETE.id; day2RemovalRequest = startRequest(day2RemovalRequest); waitForRequestToComplete(day2RemovalRequest); verifyRemoved(composite1); verifyRemoved(container1); ContainerNetworkState net = getDocument(ContainerNetworkState.class, network.documentSelfLink); assertEquals(0, net.compositeComponentLinks.size()); }
@Test public void testRemoveEmptyCompositeComponent() throws Throwable { CompositeComponent composite = createCompositeComponent(); RequestBrokerState day2RemovalRequest = new RequestBrokerState(); day2RemovalRequest.resourceType = ResourceType.COMPOSITE_COMPONENT_TYPE.getName(); day2RemovalRequest.resourceLinks = new HashSet<>(Collections.singletonList( composite.documentSelfLink)); day2RemovalRequest.operation = ContainerOperationType.DELETE.id; day2RemovalRequest = startRequest(day2RemovalRequest); waitForRequestToComplete(day2RemovalRequest); // verify the CompositeComponent has been removed composite = searchForDocument(CompositeComponent.class, composite.documentSelfLink); assertNull(composite); }
public static RequestBrokerState createRequestState(String resourceType, String resourceDescriptionLink, String operation, Map<String, String> customProperties) { RequestBrokerState request = new RequestBrokerState(); request.resourceType = resourceType; request.resourceDescriptionLink = resourceDescriptionLink; request.tenantLinks = createTenantLinks(TENANT_NAME); request.operation = operation; request.customProperties = customProperties; return request; }