use of com.google.api.services.notebooks.v1.model.Instance in project photon-model by vmware.
the class AWSComputeStateCreationAdapterService method addUpdateOrRemoveNICStates.
/**
* From the previously calculated NICs delta (based on whether the local state correspond to
* existing AWS object, the AWS object was deleted, or a new AWS object was added): 1) Create,
* update or delete NICState objects 2) Update the CS's references to the added or removed
* NetworkInterfaceStates
*/
private Map<String, Map<String, Collection<Object>>> addUpdateOrRemoveNICStates(AWSComputeStateCreationContext context, Instance instance, Map<String, List<Integer>> nicsDeviceIndexDeltaMap, String existingEndpointLink, Set<String> endpointLinks) {
List<NetworkInterfaceState> existingNicStates = context.request.nicStatesToBeUpdated.get(instance.getInstanceId());
// Generate operation for adding NIC state and description, and retain its link to add to
// the CS
List<Integer> deviceIndexesToAdd = nicsDeviceIndexDeltaMap.get(ADD_NIC_STATES);
Collection<Object> networkInterfaceLinksToBeAdded = instance.getNetworkInterfaces().stream().filter(awsNic -> deviceIndexesToAdd.contains(awsNic.getAttachment().getDeviceIndex()) && context.request.enumeratedNetworks != null && context.request.enumeratedNetworks.subnets != null && context.request.enumeratedNetworks.subnets.containsKey(awsNic.getSubnetId())).map(awsNic -> createNICStateAndDescription(context, awsNic, existingEndpointLink, endpointLinks)).map(addedNicState -> UriUtils.buildUriPath(NetworkInterfaceService.FACTORY_LINK, addedNicState.documentSelfLink)).collect(Collectors.toList());
// Generate operation for removing NIC states, and retain its link to remove from the CS {{
List<Integer> deviceIndexesToRemove = nicsDeviceIndexDeltaMap.get(REMOVE_NIC_STATES);
Collection<Object> networkInterfaceLinksToBeRemoved = deviceIndexesToRemove.stream().map(deviceIndexToRemove -> {
NetworkInterfaceState stateToDelete = existingNicStates.stream().filter(existNicState -> existNicState.deviceIndex == deviceIndexToRemove).findFirst().orElse(null);
return stateToDelete;
}).filter(existingNicState -> existingNicState != null).map(existingNicState -> deleteNICState(context, existingNicState)).map(existingNicState -> existingNicState.documentSelfLink).collect(Collectors.toList());
// Generate operation for updating NIC states, no links should be updated on CS in this case
List<Integer> deviceIndexesToUpdate = nicsDeviceIndexDeltaMap.get(UPDATE_NIC_STATES);
deviceIndexesToUpdate.stream().map(deviceIndexToUpdate -> existingNicStates.stream().filter(existNicState -> existNicState.deviceIndex == deviceIndexToUpdate).findFirst().orElse(null)).filter(existingNicState -> existingNicState != null).forEach(existingNicState -> updateNICState(context, instance, existingNicState));
if (context.request.nicStatesToBeDeleted.size() > 0 && context.request.nicStatesToBeDeleted.get(instance.getInstanceId()) != null) {
this.logInfo(() -> String.format("Compute %s failed to discover %d nics", instance.getInstanceId(), context.request.nicStatesToBeDeleted.get(instance.getInstanceId()).size()));
networkInterfaceLinksToBeRemoved.addAll(context.request.nicStatesToBeDeleted.get(instance.getInstanceId()));
}
Map<String, Map<String, Collection<Object>>> nicsDeltaMap = new HashMap<>();
// only add the collections to the delta map in case there is something to add/remove
if (!networkInterfaceLinksToBeRemoved.isEmpty()) {
Map<String, Collection<Object>> collectionsToRemoveMap = new HashMap<>();
collectionsToRemoveMap.put(ComputeState.FIELD_NAME_NETWORK_INTERFACE_LINKS, networkInterfaceLinksToBeRemoved);
nicsDeltaMap.put(REMOVE_NIC_STATES, collectionsToRemoveMap);
}
if (!networkInterfaceLinksToBeAdded.isEmpty()) {
Map<String, Collection<Object>> collectionsToAddMap = new HashMap<>();
collectionsToAddMap.put(ComputeState.FIELD_NAME_NETWORK_INTERFACE_LINKS, networkInterfaceLinksToBeAdded);
nicsDeltaMap.put(ADD_NIC_STATES, collectionsToAddMap);
}
return nicsDeltaMap;
}
use of com.google.api.services.notebooks.v1.model.Instance in project photon-model by vmware.
the class AWSEnumerationAndDeletionAdapterService method retireComputeStates.
/**
* Creates operations to retire all the compute states in the local system for which the AWS
* instance has been terminated/missing from the remote instance.
*/
private void retireComputeStates(EnumerationDeletionContext context) {
List<Operation> operations = new ArrayList<>();
// Disks.
for (ComputeState cs : context.instancesToBeDeleted) {
ComputeState cps = new ComputeState();
cps.powerState = PowerState.OFF;
cps.lifecycleState = LifecycleState.RETIRED;
Operation operation = Operation.createPatch(this.getHost(), cs.documentSelfLink).setBody(cps).setReferer(getHost().getUri());
operations.add(operation);
}
// Kick off patch operations with a join handler.
if (operations == null || operations.size() == 0) {
logFine(() -> "No local compute states to be deleted.");
deleteResourcesInLocalSystem(context);
return;
}
OperationJoin.JoinedCompletionHandler joinCompletion = (ox, exc) -> {
if (exc != null) {
logSevere(() -> String.format("Failure retiring local compute states: %s ", Utils.toString(exc)));
deleteResourcesInLocalSystem(context);
return;
}
logFine(() -> "Successfully retired local compute states.");
deleteResourcesInLocalSystem(context);
return;
};
OperationJoin joinOp = OperationJoin.create(operations);
joinOp.setCompletion(joinCompletion);
joinOp.sendWith(getHost());
}
use of com.google.api.services.notebooks.v1.model.Instance in project photon-model by vmware.
the class TestAWSProvisionTask method assertVMSercurityGroupsConfiguration.
private void assertVMSercurityGroupsConfiguration(Instance instance, ComputeState vm) {
// This assert is only suitable for real (non-mocking env).
if (this.isMock) {
return;
}
this.host.log(Level.INFO, "%s: Assert security groups configuration for [%s] VM", this.currentTestName.getMethodName(), this.vmState.name);
// Get the SecurityGroupStates that were provided in the request ComputeState
Collector<SecurityGroupState, ?, Map<String, SecurityGroupState>> convertToMap = Collectors.<SecurityGroupState, String, SecurityGroupState>toMap(sg -> sg.name, sg -> sg);
Map<String, SecurityGroupState> currentSGNamesToStates = vm.networkInterfaceLinks.stream().map(nicLink -> this.host.getServiceState(null, NetworkInterfaceState.class, UriUtils.buildUri(this.host, nicLink))).<// collect all SecurityGroup States from all NIC states
SecurityGroupState>flatMap(nicState -> nicState.securityGroupLinks.stream().map(sgLink -> {
SecurityGroupState sgState = this.host.getServiceState(null, SecurityGroupState.class, UriUtils.buildUri(this.host, sgLink));
return sgState;
})).collect(convertToMap);
// Compare ComputeState after provisioning to the ComputeState in the request
assertNotNull("Instance should have security groups attached.", instance.getSecurityGroups());
// Provisioned Instance should have the same number of SecurityGroups as requested
assertEquals(instance.getSecurityGroups().size(), currentSGNamesToStates.size());
for (SecurityGroupState currentSGState : currentSGNamesToStates.values()) {
// Get corresponding requested state
GroupIdentifier provisionedGroupIdentifier = null;
for (GroupIdentifier awsGroupIdentifier : instance.getSecurityGroups()) {
if (awsGroupIdentifier.getGroupId().equals(currentSGState.id)) {
provisionedGroupIdentifier = awsGroupIdentifier;
break;
}
}
// Ensure that the requested SecurityGroup was actually provisioned
assertNotNull(provisionedGroupIdentifier);
if (currentSGState.name.contains(TestAWSSetupUtils.AWS_NEW_GROUP_PREFIX)) {
this.sgToCleanUp = currentSGState.id;
SecurityGroup awsSecurityGroup = getSecurityGroupsIdUsingEC2Client(this.client, provisionedGroupIdentifier.getGroupId());
assertNotNull(awsSecurityGroup);
// Validate rules are correctly created as requested
IpPermission awsIngressRule = awsSecurityGroup.getIpPermissions().get(0);
IpPermission awsEgressRule = awsSecurityGroup.getIpPermissionsEgress().get(1);
assertNotNull(awsIngressRule);
assertNotNull(awsEgressRule);
assertEquals("Error in created ingress rule", awsIngressRule.getIpProtocol(), currentSGState.ingress.get(0).protocol);
assertEquals("Error in created ingress rule", awsIngressRule.getIpv4Ranges().get(0).getCidrIp(), currentSGState.ingress.get(0).ipRangeCidr);
assertEquals("Error in created egress rule", awsEgressRule.getIpProtocol(), currentSGState.egress.get(0).protocol);
assertEquals("Error in created egress rule", awsEgressRule.getIpv4Ranges().get(0).getCidrIp(), currentSGState.egress.get(0).ipRangeCidr);
}
}
}
use of com.google.api.services.notebooks.v1.model.Instance in project photon-model by vmware.
the class TestAWSProvisionTask method testProvision.
// Creates a AWS instance via a provision task.
@Test
public void testProvision() throws Throwable {
initResourcePoolAndComputeHost();
// create a AWS VM compute resoruce
boolean addNonExistingSecurityGroup = true;
this.vmState = createAWSVMResource(this.host, this.computeHost, this.endpointState, this.getClass(), this.currentTestName.getMethodName() + "_vm1", zoneId, regionId, null, /* tagLinks */
this.singleNicSpec, addNonExistingSecurityGroup, this.awsTestContext);
// set placement link
String zoneId = TestAWSSetupUtils.zoneId + avalabilityZoneIdentifier;
ComputeState zoneComputeState = createAWSComputeHost(this.host, this.endpointState, zoneId, regionId, this.isAwsClientMock, this.awsMockEndpointReference, null);
zoneComputeState.id = zoneId;
zoneComputeState = TestUtils.doPatch(this.host, zoneComputeState, ComputeState.class, UriUtils.buildUri(this.host, zoneComputeState.documentSelfLink));
if (this.vmState.customProperties == null) {
this.vmState.customProperties = new HashMap<>();
}
this.vmState.customProperties.put(PLACEMENT_LINK, zoneComputeState.documentSelfLink);
TestUtils.doPatch(this.host, this.vmState, ComputeState.class, UriUtils.buildUri(this.host, this.vmState.documentSelfLink));
// kick off a provision task to do the actual VM creation
ProvisionComputeTaskState provisionTask = new ProvisionComputeTaskService.ProvisionComputeTaskState();
provisionTask.computeLink = this.vmState.documentSelfLink;
provisionTask.isMockRequest = this.isMock;
provisionTask.taskSubStage = ProvisionComputeTaskState.SubStage.CREATING_HOST;
// Wait for default request timeout in minutes for the machine to be powered ON before
// reporting failure to the parent task.
provisionTask.documentExpirationTimeMicros = Utils.getNowMicrosUtc() + TimeUnit.MINUTES.toMicros(AWS_VM_REQUEST_TIMEOUT_MINUTES);
provisionTask.tenantLinks = this.endpointState.tenantLinks;
provisionTask = TestUtils.doPost(this.host, provisionTask, ProvisionComputeTaskState.class, UriUtils.buildUri(this.host, ProvisionComputeTaskService.FACTORY_LINK));
this.host.waitForFinishedTask(ProvisionComputeTaskState.class, provisionTask.documentSelfLink);
// check that the VM has been created
ProvisioningUtils.queryComputeInstances(this.host, 3);
if (!this.isMock) {
ComputeState compute = getCompute(this.host, this.vmState.documentSelfLink);
List<Instance> instances = getAwsInstancesByIds(this.client, this.host, Collections.singletonList(compute.id));
Instance instance = instances.get(0);
assertTags(Collections.emptySet(), instance, this.vmState.name);
assertVmNetworksConfiguration(instance);
assertStorageConfiguration(this.client, instance, compute);
assertEquals(zoneId, instance.getPlacement().getAvailabilityZone());
}
this.host.setTimeoutSeconds(600);
this.host.waitFor("Error waiting for stats with default collection windows", () -> {
try {
this.host.log(Level.INFO, "Issuing stats request for VM with default collection window.");
issueStatsRequest(this.vmState, null);
} catch (Throwable t) {
return false;
}
return true;
});
// store the network links and disk links for removal check later
List<String> resourcesToDelete = new ArrayList<>();
if (this.vmState.diskLinks != null) {
resourcesToDelete.addAll(this.vmState.diskLinks);
}
if (this.vmState.networkInterfaceLinks != null) {
resourcesToDelete.addAll(this.vmState.networkInterfaceLinks);
}
// delete vm
TestAWSSetupUtils.deleteVMs(this.vmState.documentSelfLink, this.isMock, this.host);
// validates the local documents of network links and disk links have been removed
verifyRemovalOfResourceState(this.host, resourcesToDelete);
// create another AWS VM
List<String> instanceIdList = new ArrayList<>();
Set<TagState> tags = createTags(null, "testProvisionKey1", "testProvisionValue1", "testProvisionKey2", "testProvisionValue2");
Set<String> tagLinks = tags.stream().map(t -> t.documentSelfLink).collect(Collectors.toSet());
addNonExistingSecurityGroup = false;
this.vmState = createAWSVMResource(this.host, this.computeHost, this.endpointState, this.getClass(), this.currentTestName.getMethodName() + "_vm2", TestAWSSetupUtils.zoneId, regionId, tagLinks, this.singleNicSpec, addNonExistingSecurityGroup, this.awsTestContext);
TestAWSSetupUtils.provisionMachine(this.host, this.vmState, this.isMock, instanceIdList);
if (!this.isMock) {
ComputeState compute = getCompute(this.host, this.vmState.documentSelfLink);
List<Instance> instances = getAwsInstancesByIds(this.client, this.host, Collections.singletonList(compute.id));
assertTags(tags, instances.get(0), this.vmState.name);
assertVmNetworksConfiguration(instances.get(0));
assertStorageConfiguration(this.client, instances.get(0), compute);
// reach out to AWS and get the current state
TestAWSSetupUtils.getBaseLineInstanceCount(this.host, this.client, null);
}
// delete just the local representation of the resource
TestAWSSetupUtils.deleteVMs(this.vmState.documentSelfLink, this.isMock, this.host, true);
if (!this.isMock) {
try {
TestAWSSetupUtils.getBaseLineInstanceCount(this.host, this.client, null);
} finally {
TestAWSSetupUtils.deleteVMsUsingEC2Client(this.client, this.host, instanceIdList);
deleteSecurityGroupUsingEC2Client(this.client, this.host, this.sgToCleanUp);
}
}
this.vmState = null;
this.sgToCleanUp = null;
}
use of com.google.api.services.notebooks.v1.model.Instance in project photon-model by vmware.
the class TestAWSProvisionTask method assertTags.
private void assertTags(Set<TagState> expectedTagStates, Instance instance, String instanceName) {
Set<Tag> expectedTags = expectedTagStates.stream().map(ts -> new Tag(ts.key, ts.value)).collect(Collectors.toSet());
Set<Tag> actualTags = new HashSet<>(instance.getTags());
// account for the name tag
assertEquals(expectedTags.size() + 1, actualTags.size());
assertTrue(actualTags.containsAll(expectedTags));
Tag nameTag = new Tag(AWSConstants.AWS_TAG_NAME, instanceName);
assertTrue(actualTags.contains(nameTag));
}
Aggregations