-
Notifications
You must be signed in to change notification settings - Fork 168
Description
package com.oracle.acs;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.logging.LogRecord;
import org.apache.commons.io.FilenameUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.oracle.bmc.Region;
import com.oracle.bmc.auth.ResourcePrincipalAuthenticationDetailsProvider;
import com.oracle.bmc.core.ComputeClient;
import com.oracle.bmc.core.ComputeManagementClient;
import com.oracle.bmc.core.ComputeWaiters;
import com.oracle.bmc.core.model.ComputeInstanceDetails;
import com.oracle.bmc.core.model.CreateImageDetails;
import com.oracle.bmc.core.model.CreateImageDetails.LaunchMode;
import com.oracle.bmc.core.model.CreateInstanceConfigurationDetails;
import com.oracle.bmc.core.model.ImageSourceDetails;
import com.oracle.bmc.core.model.ImageSourceDetails.SourceImageType;
import com.oracle.bmc.core.model.ImageSourceViaObjectStorageTupleDetails;
import com.oracle.bmc.core.model.ImageSourceViaObjectStorageUriDetails;
import com.oracle.bmc.core.model.Instance;
import com.oracle.bmc.core.model.Instance.LifecycleState;
import com.oracle.bmc.core.model.InstanceConfiguration;
import com.oracle.bmc.core.model.InstanceConfigurationCreateVnicDetails;
import com.oracle.bmc.core.model.InstanceConfigurationInstanceDetails;
import com.oracle.bmc.core.model.InstanceConfigurationInstanceSourceViaImageDetails;
import com.oracle.bmc.core.model.InstanceConfigurationLaunchInstanceDetails;
import com.oracle.bmc.core.requests.CreateImageRequest;
import com.oracle.bmc.core.requests.CreateInstanceConfigurationRequest;
import com.oracle.bmc.core.requests.GetInstanceRequest;
import com.oracle.bmc.core.requests.InstanceActionRequest;
import com.oracle.bmc.core.requests.LaunchInstanceConfigurationRequest;
import com.oracle.bmc.core.requests.ListInstancesRequest;
import com.oracle.bmc.core.responses.CreateImageResponse;
import com.oracle.bmc.core.responses.CreateInstanceConfigurationResponse;
import com.oracle.bmc.core.responses.GetInstanceResponse;
import com.oracle.bmc.core.responses.InstanceActionResponse;
import com.oracle.bmc.core.responses.LaunchInstanceConfigurationResponse;
import com.oracle.bmc.core.responses.ListInstancesResponse;
import com.oracle.bmc.identity.IdentityClient;
import com.oracle.bmc.identity.model.AvailabilityDomain;
import com.oracle.bmc.identity.model.Compartment;
import com.oracle.bmc.identity.requests.GetTenancyRequest;
import com.oracle.bmc.identity.requests.ListAvailabilityDomainsRequest;
import com.oracle.bmc.identity.requests.ListCompartmentsRequest;
import com.oracle.bmc.identity.responses.GetWorkRequestResponse;
import com.oracle.bmc.identity.responses.ListAvailabilityDomainsResponse;
import com.oracle.bmc.identity.responses.ListCompartmentsResponse;
import com.oracle.bmc.objectstorage.ObjectStorage;
import com.oracle.bmc.objectstorage.ObjectStorageClient;
import com.oracle.bmc.objectstorage.model.ListObjects;
import com.oracle.bmc.objectstorage.model.ObjectSummary;
import com.oracle.bmc.objectstorage.requests.GetObjectRequest;
import com.oracle.bmc.objectstorage.requests.ListObjectsRequest;
import com.oracle.bmc.objectstorage.requests.ListWorkRequestLogsRequest;
import com.oracle.bmc.objectstorage.responses.GetObjectResponse;
import com.oracle.bmc.objectstorage.responses.ListObjectsResponse;
import com.oracle.bmc.workrequests.WorkRequestClient;
import com.oracle.bmc.workrequests.requests.GetWorkRequestRequest;
import com.oracle.bmc.workrequests.responses.ListWorkRequestLogsResponse;
import io.cloudevents.CloudEvent;
import com.fnproject.fn.api.FnConfiguration;
import com.fnproject.fn.api.RuntimeContext;
public class OSEventCrateInstance {
String compartmentId;
String tenancyid;
String action;
String availabilityDomain;
String subnetId;
@FnConfiguration
public void config(RuntimeContext ctx) {
compartmentId = ctx.getConfigurationByKey("compartmentid").orElse("");
tenancyid = ctx.getConfigurationByKey("tenancyid").orElse("");
availabilityDomain = ctx.getConfigurationByKey("availabilityDomain").orElse("");
subnetId = ctx.getConfigurationByKey("subnetId").orElse("");
}
//com.oraclecloud.computeapi.createimage.end
public String createInstanceFromImage(ComputeClient computeClient, CloudEvent event,ComputeManagementClient computeManagementClient) {
StringBuffer sb = new StringBuffer();
ObjectMapper objectMapper = new ObjectMapper();
Map data = objectMapper.convertValue(event.getData().get(), Map.class);
InstanceConfigurationCreateVnicDetails vnicDetails = InstanceConfigurationCreateVnicDetails.builder()
.subnetId(subnetId).build();
InstanceConfigurationInstanceSourceViaImageDetails sourceDetails = InstanceConfigurationInstanceSourceViaImageDetails
.builder().imageId((String) data.get("resourceId")).bootVolumeSizeInGBs(50l).build();
InstanceConfigurationLaunchInstanceDetails launchDetails = InstanceConfigurationLaunchInstanceDetails.builder()
.compartmentId(compartmentId).availabilityDomain(availabilityDomain).displayName((String) data.get("resourceName"))
.createVnicDetails(vnicDetails).shape("VM.Standard2.1").sourceDetails(sourceDetails).build();
ComputeInstanceDetails instanceDetails = ComputeInstanceDetails.builder().launchDetails(launchDetails).build();
CreateInstanceConfigurationDetails configurationDetails = CreateInstanceConfigurationDetails.builder()
.displayName((String) data.get("resourceName")).compartmentId(compartmentId).instanceDetails(instanceDetails).build();
CreateInstanceConfigurationRequest req = CreateInstanceConfigurationRequest.builder()
.createInstanceConfiguration(configurationDetails).build();
CreateInstanceConfigurationResponse response = computeManagementClient.createInstanceConfiguration(req);
InstanceConfiguration instanceConfiguration = response.getInstanceConfiguration();
System.out.printf("Created instance configuration:%s%n", instanceConfiguration.getId());
LaunchInstanceConfigurationResponse launchResponse = computeManagementClient.launchInstanceConfiguration(
LaunchInstanceConfigurationRequest.builder().instanceConfigurationId(instanceConfiguration.getId())
.instanceConfiguration(ComputeInstanceDetails.builder().build()).build());
return sb.toString();
}
public String createImageFromOS(ComputeClient computeClient, CloudEvent event,ObjectStorageClient objectStorageClient) {
StringBuffer sb = new StringBuffer();
ObjectMapper objectMapper = new ObjectMapper();
Map data = objectMapper.convertValue(event.getData().get(), Map.class);
Map additionalDetails = objectMapper.convertValue(data.get("additionalDetails"), Map.class);
String objectName = data.get("resourceName").toString();
String bucketName = additionalDetails.get("bucketName").toString();
String namespaceName = additionalDetails.get("namespace").toString();
String imgExt = FilenameUtils.getExtension(objectName);
String instName = FilenameUtils.getBaseName(objectName);
if (imgExt.toUpperCase().equals(ImageSourceDetails.SourceImageType.Vmdk.getValue().toUpperCase())
|| imgExt.toUpperCase().equals(ImageSourceDetails.SourceImageType.Qcow2.getValue().toUpperCase())
|| imgExt.toUpperCase().equals("VDI")) {
try {
ImageSourceViaObjectStorageTupleDetails imageSourceDetailsTul = ImageSourceViaObjectStorageTupleDetails
.builder()
.namespaceName(namespaceName.trim())
.bucketName(bucketName.trim())
.objectName(objectName.trim())
.sourceImageType(SourceImageType.Vmdk)
.build();
ImageSourceDetails imageSourceDetailsURI = ImageSourceViaObjectStorageUriDetails
.builder()
.sourceUri((String) data.get("resourceId")).build();
CreateImageDetails imageDetails = CreateImageDetails
.builder()
.displayName(instName)
.compartmentId(compartmentId)
.imageSourceDetails(imageSourceDetailsTul)
.launchMode(LaunchMode.Paravirtualized)
.build();
CreateImageRequest createImgReq = CreateImageRequest
.builder()
.createImageDetails(imageDetails)
.build();
CreateImageResponse crImgResp = computeClient.createImage(createImgReq);
// com.oracle.bmc.workrequests.requests.ListWorkRequestLogsRequest lreq = com.oracle.bmc.workrequests.requests.ListWorkRequestLogsRequest.builder().opcRequestId(crImgResp.getOpcRequestId()).build();
//
// ListWorkRequestLogsResponse lresp = workerClient.listWorkRequestLogs(lreq);
//
// lresp.getItems().stream().forEach(entry -> sb.append(String.format("%s \n",entry.getMessage())));
//
} catch (Exception e) {
e.printStackTrace();
System.out.printf("Exception occured:%s%n", e.getMessage());
sb.append(String.format("Exception occured:%s\n", e.getMessage()));
sb.append(String.format("[%s] -> ]%s] -> ]%s] \n", namespaceName, bucketName, objectName));
sb.append(String.format("%s \n",data.get("resourceId")));
}
} else {
System.out.printf("File extension not suppoted:%s%n", imgExt);
}
return sb.toString();
}
public String handleRequest(CloudEvent event) throws IOException {
System.out.println("OSEventCrateInstance called!");
System.out.println(event);
StringBuffer sb = new StringBuffer();
if (compartmentId.equals("") || tenancyid.equals("") || subnetId.equals("") || availabilityDomain.equals("")) {
System.out.println("Configuration parameters not set at function level");
return "Configuration parameters not set at function level";
}
ResourcePrincipalAuthenticationDetailsProvider provider = ResourcePrincipalAuthenticationDetailsProvider
.builder().build();
final ComputeClient computeClient = new ComputeClient(provider);
final ComputeManagementClient computeManagementClient = new ComputeManagementClient(provider);
final IdentityClient identityClient = new IdentityClient(provider);
final ObjectStorageClient objectStorageClient = new ObjectStorageClient(provider);
final WorkRequestClient workerClient = new WorkRequestClient(provider);
sb.append(String.format("Region is %s \n", provider.getRegion()));
// computeClient.setRegion(Region.UK_LONDON_1);
// ListObjectsResponse objresp = objectStorageClient.listObjects(ListObjectsRequest.builder().namespaceName("oci_core_emea_acs_kalsi").bucketName("ZZOSFn").build());
//
// for(ObjectSummary objN: objresp.getListObjects().getObjects()) {
//
// sb.append(String.format("ZZ > %s \n",objN.getName() ));
//
// }
if (event.getType().equals("com.oraclecloud.objectstorage.createobject")) {
sb.append(createImageFromOS(computeClient, event,objectStorageClient));
}else if(event.getType().equals("com.oraclecloud.computeapi.createimage.end")) {
sb.append(createInstanceFromImage(computeClient, event, computeManagementClient));
}
computeClient.close();
computeManagementClient.close();
identityClient.close();
objectStorageClient.close();
// sb.append("ZZ");
System.out.println("OSEventCrateInstance finished!");
return sb.toString();
}
protected List<AvailabilityDomain> getAvailabilityDomains(final IdentityClient identityClient,
final String compartmentId) {
ListAvailabilityDomainsResponse listAvailabilityDomainsResponse = identityClient
.listAvailabilityDomains(ListAvailabilityDomainsRequest.builder().compartmentId(compartmentId).build());
return listAvailabilityDomainsResponse.getItems();
}
}