Skip to content

OCI Function Create Image from OS failed when using ResourcePrincipalAuthenticationDetailsProvider #260

@zzghal2

Description

@zzghal2

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();
}

}

Metadata

Metadata

Assignees

No one assigned

    Labels

    ComputeIssue pertains to the Compute service

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions