// This is an automatically generated code sample.
// To make this code sample work in your Oracle Cloud tenancy,
// please replace the values for any parameters whose current values do not fit
// your use case (such as resource IDs, strings containing ‘EXAMPLE’ or ‘unique_id’, and
// boolean, number, and enum parameters with values not fitting your use case).

import * as core from "oci-core";
import common = require("oci-common");

// Create a default authentication provider that uses the DEFAULT
// profile in the configuration file.
// Refer to <see href="https://docs.cloud.oracle.com/en-us/iaas/Content/API/Concepts/sdkconfig.htm#SDK_and_CLI_Configuration_File>the public documentation</see> on how to prepare a configuration file.

const provider: common.ConfigFileAuthenticationDetailsProvider = new common.ConfigFileAuthenticationDetailsProvider();

(async () => {
  try {
    // Create a service client
    const client = new core.ComputeManagementClient({ authenticationDetailsProvider: provider });

    // Create a request and dependent object(s).
    const instanceConfigurationInstanceDetails = {
      instanceType: "instance_options",
      options: [
        {
          instanceType: "compute",
          blockVolumes: [
            {
              attachDetails: {
                type: "paravirtualized",
                isPvEncryptionInTransitEnabled: true,
                displayName: "EXAMPLE-displayName-Value",
                isReadOnly: true,
                device: "EXAMPLE-device-Value",
                isShareable: false
              },
              createDetails: {
                availabilityDomain: "EXAMPLE-availabilityDomain-Value",
                backupPolicyId: "ocid1.test.oc1..<unique_ID>EXAMPLE-backupPolicyId-Value",
                compartmentId: "ocid1.test.oc1..<unique_ID>EXAMPLE-compartmentId-Value",
                isAutoTuneEnabled: true,
                blockVolumeReplicas: [
                  {
                    displayName: "EXAMPLE-displayName-Value",
                    availabilityDomain: "EXAMPLE-availabilityDomain-Value"
                  }
                ],
                definedTags: {
                  EXAMPLE_KEY_6xGsi: {
                    EXAMPLE_KEY_TZ75y: "EXAMPLE--Value"
                  }
                },
                displayName: "EXAMPLE-displayName-Value",
                freeformTags: {
                  EXAMPLE_KEY_ZARz5: "EXAMPLE_VALUE_ftv2LwD5773divBL588A"
                },
                kmsKeyId: "ocid1.test.oc1..<unique_ID>EXAMPLE-kmsKeyId-Value",
                vpusPerGB: 342,
                clusterPlacementGroupId:
                  "ocid1.test.oc1..<unique_ID>EXAMPLE-clusterPlacementGroupId-Value",
                sizeInGBs: 873,
                sourceDetails: {
                  type: "volumeBackup",
                  id: "ocid1.test.oc1..<unique_ID>EXAMPLE-id-Value"
                },
                autotunePolicies: [
                  {
                    autotuneType: "PERFORMANCE_BASED",
                    maxVpusPerGB: 269
                  }
                ]
              },
              volumeId: "ocid1.test.oc1..<unique_ID>EXAMPLE-volumeId-Value"
            }
          ],
          launchDetails: {
            availabilityDomain: "EXAMPLE-availabilityDomain-Value",
            capacityReservationId: "ocid1.test.oc1..<unique_ID>EXAMPLE-capacityReservationId-Value",
            compartmentId: "ocid1.test.oc1..<unique_ID>EXAMPLE-compartmentId-Value",
            clusterPlacementGroupId:
              "ocid1.test.oc1..<unique_ID>EXAMPLE-clusterPlacementGroupId-Value",
            createVnicDetails: {
              assignIpv6Ip: false,
              assignPublicIp: false,
              assignPrivateDnsRecord: true,
              definedTags: {
                EXAMPLE_KEY_nDhDq: {
                  EXAMPLE_KEY_1vGoC: "EXAMPLE--Value"
                }
              },
              displayName: "EXAMPLE-displayName-Value",
              freeformTags: {
                EXAMPLE_KEY_olc0b: "EXAMPLE_VALUE_gAw3XfHaTmby8OfmRPAh"
              },
              ipv6AddressIpv6SubnetCidrPairDetails: [
                {
                  ipv6SubnetCidr: "EXAMPLE-ipv6SubnetCidr-Value",
                  ipv6Address: "EXAMPLE-ipv6Address-Value"
                }
              ],
              hostnameLabel: "EXAMPLE-hostnameLabel-Value",
              nsgIds: ["EXAMPLE--Value"],
              privateIp: "EXAMPLE-privateIp-Value",
              skipSourceDestCheck: true,
              subnetId: "ocid1.test.oc1..<unique_ID>EXAMPLE-subnetId-Value"
            },
            definedTags: {
              EXAMPLE_KEY_GIxZ6: {
                EXAMPLE_KEY_94x58: "EXAMPLE--Value"
              }
            },
            displayName: "EXAMPLE-displayName-Value",
            extendedMetadata: {
              EXAMPLE_KEY_0LerD: "EXAMPLE--Value"
            },
            freeformTags: {
              EXAMPLE_KEY_JZV16: "EXAMPLE_VALUE_PjxblHsTVTqgZ0ameI81"
            },
            ipxeScript: "EXAMPLE-ipxeScript-Value",
            metadata: {
              EXAMPLE_KEY_Ytm3h: "EXAMPLE_VALUE_xIrVoEzyScyYKxbRwnn5"
            },
            shape: "EXAMPLE-shape-Value",
            shapeConfig: {
              ocpus: 136.22403,
              vcpus: 882,
              memoryInGBs: 7643.2524,
              baselineOcpuUtilization:
                core.models.InstanceConfigurationLaunchInstanceShapeConfigDetails
                  .BaselineOcpuUtilization.Baseline18,
              nvmes: 5
            },
            platformConfig: {
              type: "INTEL_SKYLAKE_BM",
              numaNodesPerSocket:
                core.models.InstanceConfigurationIntelSkylakeBmLaunchInstancePlatformConfig
                  .NumaNodesPerSocket.Nps1,
              isSymmetricMultiThreadingEnabled: false,
              isInputOutputMemoryManagementUnitEnabled: false,
              percentageOfCoresEnabled: 89,
              configMap: {
                EXAMPLE_KEY_DvG68: "EXAMPLE_VALUE_jMNUrfESGILYjxpKxaFf"
              },
              isSecureBootEnabled: false,
              isTrustedPlatformModuleEnabled: true,
              isMeasuredBootEnabled: false,
              isMemoryEncryptionEnabled: false
            },
            sourceDetails: {
              sourceType: "image",
              bootVolumeSizeInGBs: 659,
              imageId: "ocid1.test.oc1..<unique_ID>EXAMPLE-imageId-Value",
              kmsKeyId: "ocid1.test.oc1..<unique_ID>EXAMPLE-kmsKeyId-Value",
              bootVolumeVpusPerGB: 893,
              instanceSourceImageFilterDetails: {
                compartmentId: "ocid1.test.oc1..<unique_ID>EXAMPLE-compartmentId-Value",
                definedTagsFilter: {
                  EXAMPLE_KEY_I3l1p: {
                    EXAMPLE_KEY_lICs9: "EXAMPLE--Value"
                  }
                },
                operatingSystem: "EXAMPLE-operatingSystem-Value",
                operatingSystemVersion: "EXAMPLE-operatingSystemVersion-Value"
              }
            },
            faultDomain: "EXAMPLE-faultDomain-Value",
            dedicatedVmHostId: "ocid1.test.oc1..<unique_ID>EXAMPLE-dedicatedVmHostId-Value",
            launchMode: core.models.InstanceConfigurationLaunchInstanceDetails.LaunchMode.Emulated,
            launchOptions: {
              bootVolumeType: core.models.InstanceConfigurationLaunchOptions.BootVolumeType.Vfio,
              firmware: core.models.InstanceConfigurationLaunchOptions.Firmware.Uefi64,
              networkType: core.models.InstanceConfigurationLaunchOptions.NetworkType.Vfio,
              remoteDataVolumeType:
                core.models.InstanceConfigurationLaunchOptions.RemoteDataVolumeType.Iscsi,
              isPvEncryptionInTransitEnabled: true,
              isConsistentVolumeNamingEnabled: false
            },
            agentConfig: {
              isMonitoringDisabled: true,
              isManagementDisabled: false,
              areAllPluginsDisabled: true,
              pluginsConfig: [
                {
                  name: "EXAMPLE-name-Value",
                  desiredState: core.models.InstanceAgentPluginConfigDetails.DesiredState.Enabled
                }
              ]
            },
            isPvEncryptionInTransitEnabled: false,
            preferredMaintenanceAction:
              core.models.InstanceConfigurationLaunchInstanceDetails.PreferredMaintenanceAction
                .LiveMigrate,
            instanceOptions: {
              areLegacyImdsEndpointsDisabled: true
            },
            availabilityConfig: {
              isLiveMigrationPreferred: false,
              recoveryAction:
                core.models.InstanceConfigurationAvailabilityConfig.RecoveryAction.RestoreInstance
            },
            preemptibleInstanceConfig: {
              preemptionAction: {
                type: "TERMINATE",
                preserveBootVolume: false
              }
            }
          },
          secondaryVnics: [
            {
              createVnicDetails: {
                assignIpv6Ip: true,
                assignPublicIp: true,
                assignPrivateDnsRecord: true,
                definedTags: {
                  EXAMPLE_KEY_3JzAT: {
                    EXAMPLE_KEY_zKyl0: "EXAMPLE--Value"
                  }
                },
                displayName: "EXAMPLE-displayName-Value",
                freeformTags: {
                  EXAMPLE_KEY_on7cC: "EXAMPLE_VALUE_VInm3lOYAstzBgQf5x56"
                },
                ipv6AddressIpv6SubnetCidrPairDetails: [
                  {
                    ipv6SubnetCidr: "EXAMPLE-ipv6SubnetCidr-Value",
                    ipv6Address: "EXAMPLE-ipv6Address-Value"
                  }
                ],
                hostnameLabel: "EXAMPLE-hostnameLabel-Value",
                nsgIds: ["EXAMPLE--Value"],
                privateIp: "EXAMPLE-privateIp-Value",
                skipSourceDestCheck: true,
                subnetId: "ocid1.test.oc1..<unique_ID>EXAMPLE-subnetId-Value"
              },
              displayName: "EXAMPLE-displayName-Value",
              nicIndex: 5
            }
          ]
        }
      ]
    };

    const launchInstanceConfigurationRequest: core.requests.LaunchInstanceConfigurationRequest = {
      instanceConfigurationId: "ocid1.test.oc1..<unique_ID>EXAMPLE-instanceConfigurationId-Value",
      instanceConfiguration: instanceConfigurationInstanceDetails,
      opcRetryToken: "EXAMPLE-opcRetryToken-Value"
    };

    // Send request to the Client.
    const launchInstanceConfigurationResponse = await client.launchInstanceConfiguration(
      launchInstanceConfigurationRequest
    );
  } catch (error) {
    console.log("launchInstanceConfiguration Failed with error  " + error);
  }
})();