Deploy GCP Oracle Database Cloud VM Clusters

The gcp:oracledatabase/cloudVmCluster:CloudVmCluster resource, part of the Pulumi GCP provider, provisions Oracle Database VM clusters on Google Cloud Exadata infrastructure, managing compute nodes, networking, and storage allocation. This guide focuses on three capabilities: VPC and OdbNetwork connectivity, compute and storage sizing, and diagnostic collection configuration.

VM clusters depend on CloudExadataInfrastructure resources and connect to either VPC networks or OdbNetwork resources for IP allocation. The examples are intentionally small. Combine them with your own Exadata infrastructure and network configuration.

Deploy a VM cluster with VPC networking

Most deployments create a VM cluster that connects to an existing VPC network, provisioning compute nodes and allocating IP addresses from specified CIDR ranges.

import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";

const cloudExadataInfrastructures = new gcp.oracledatabase.CloudExadataInfrastructure("cloudExadataInfrastructures", {
    cloudExadataInfrastructureId: "my-exadata",
    displayName: "my-exadata displayname",
    location: "us-east4",
    project: "my-project",
    properties: {
        shape: "Exadata.X9M",
        computeCount: 2,
        storageCount: 3,
    },
    deletionProtection: true,
});
const _default = gcp.compute.getNetwork({
    name: "new",
    project: "my-project",
});
const myVmcluster = new gcp.oracledatabase.CloudVmCluster("my_vmcluster", {
    cloudVmClusterId: "my-instance",
    displayName: "my-instance displayname",
    location: "us-east4",
    project: "my-project",
    exadataInfrastructure: cloudExadataInfrastructures.id,
    network: _default.then(_default => _default.id),
    cidr: "10.5.0.0/24",
    backupSubnetCidr: "10.6.0.0/24",
    properties: {
        licenseType: "LICENSE_INCLUDED",
        sshPublicKeys: ["ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCz1X2744t+6vRLmE5u6nHi6/QWh8bQDgHmd+OIxRQIGA/IWUtCs2FnaCNZcqvZkaeyjk5v0lTA/n+9jvO42Ipib53athrfVG8gRt8fzPL66C6ZqHq+6zZophhrCdfJh/0G4x9xJh5gdMprlaCR1P8yAaVvhBQSKGc4SiIkyMNBcHJ5YTtMQMTfxaB4G1sHZ6SDAY9a6Cq/zNjDwfPapWLsiP4mRhE5SSjJX6l6EYbkm0JeLQg+AbJiNEPvrvDp1wtTxzlPJtIivthmLMThFxK7+DkrYFuLvN5AHUdo9KTDLvHtDCvV70r8v0gafsrKkM/OE9Jtzoo0e1N/5K/ZdyFRbAkFT4QSF3nwpbmBWLf2Evg//YyEuxnz4CwPqFST2mucnrCCGCVWp1vnHZ0y30nM35njLOmWdRDFy5l27pKUTwLp02y3UYiiZyP7d3/u5pKiN4vC27VuvzprSdJxWoAvluOiDeRh+/oeQDowxoT/Oop8DzB9uJmjktXw8jyMW2+Rpg+ENQqeNgF1OGlEzypaWiRskEFlkpLb4v/s3ZDYkL1oW0Nv/J8LTjTOTEaYt2Udjoe9x2xWiGnQixhdChWuG+MaoWffzUgx1tsVj/DBXijR5DjkPkrA1GA98zd3q8GKEaAdcDenJjHhNYSd4+rE9pIsnYn7fo5X/tFfcQH1XQ== nobody@google.com"],
        cpuCoreCount: 4,
        giVersion: "19.0.0.0",
        hostnamePrefix: "hostname1",
    },
    deletionProtection: true,
});
import pulumi
import pulumi_gcp as gcp

cloud_exadata_infrastructures = gcp.oracledatabase.CloudExadataInfrastructure("cloudExadataInfrastructures",
    cloud_exadata_infrastructure_id="my-exadata",
    display_name="my-exadata displayname",
    location="us-east4",
    project="my-project",
    properties={
        "shape": "Exadata.X9M",
        "compute_count": 2,
        "storage_count": 3,
    },
    deletion_protection=True)
default = gcp.compute.get_network(name="new",
    project="my-project")
my_vmcluster = gcp.oracledatabase.CloudVmCluster("my_vmcluster",
    cloud_vm_cluster_id="my-instance",
    display_name="my-instance displayname",
    location="us-east4",
    project="my-project",
    exadata_infrastructure=cloud_exadata_infrastructures.id,
    network=default.id,
    cidr="10.5.0.0/24",
    backup_subnet_cidr="10.6.0.0/24",
    properties={
        "license_type": "LICENSE_INCLUDED",
        "ssh_public_keys": ["ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCz1X2744t+6vRLmE5u6nHi6/QWh8bQDgHmd+OIxRQIGA/IWUtCs2FnaCNZcqvZkaeyjk5v0lTA/n+9jvO42Ipib53athrfVG8gRt8fzPL66C6ZqHq+6zZophhrCdfJh/0G4x9xJh5gdMprlaCR1P8yAaVvhBQSKGc4SiIkyMNBcHJ5YTtMQMTfxaB4G1sHZ6SDAY9a6Cq/zNjDwfPapWLsiP4mRhE5SSjJX6l6EYbkm0JeLQg+AbJiNEPvrvDp1wtTxzlPJtIivthmLMThFxK7+DkrYFuLvN5AHUdo9KTDLvHtDCvV70r8v0gafsrKkM/OE9Jtzoo0e1N/5K/ZdyFRbAkFT4QSF3nwpbmBWLf2Evg//YyEuxnz4CwPqFST2mucnrCCGCVWp1vnHZ0y30nM35njLOmWdRDFy5l27pKUTwLp02y3UYiiZyP7d3/u5pKiN4vC27VuvzprSdJxWoAvluOiDeRh+/oeQDowxoT/Oop8DzB9uJmjktXw8jyMW2+Rpg+ENQqeNgF1OGlEzypaWiRskEFlkpLb4v/s3ZDYkL1oW0Nv/J8LTjTOTEaYt2Udjoe9x2xWiGnQixhdChWuG+MaoWffzUgx1tsVj/DBXijR5DjkPkrA1GA98zd3q8GKEaAdcDenJjHhNYSd4+rE9pIsnYn7fo5X/tFfcQH1XQ== nobody@google.com"],
        "cpu_core_count": 4,
        "gi_version": "19.0.0.0",
        "hostname_prefix": "hostname1",
    },
    deletion_protection=True)
package main

import (
	"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/compute"
	"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/oracledatabase"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		cloudExadataInfrastructures, err := oracledatabase.NewCloudExadataInfrastructure(ctx, "cloudExadataInfrastructures", &oracledatabase.CloudExadataInfrastructureArgs{
			CloudExadataInfrastructureId: pulumi.String("my-exadata"),
			DisplayName:                  pulumi.String("my-exadata displayname"),
			Location:                     pulumi.String("us-east4"),
			Project:                      pulumi.String("my-project"),
			Properties: &oracledatabase.CloudExadataInfrastructurePropertiesArgs{
				Shape:        pulumi.String("Exadata.X9M"),
				ComputeCount: pulumi.Int(2),
				StorageCount: pulumi.Int(3),
			},
			DeletionProtection: pulumi.Bool(true),
		})
		if err != nil {
			return err
		}
		_default, err := compute.LookupNetwork(ctx, &compute.LookupNetworkArgs{
			Name:    "new",
			Project: pulumi.StringRef("my-project"),
		}, nil)
		if err != nil {
			return err
		}
		_, err = oracledatabase.NewCloudVmCluster(ctx, "my_vmcluster", &oracledatabase.CloudVmClusterArgs{
			CloudVmClusterId:      pulumi.String("my-instance"),
			DisplayName:           pulumi.String("my-instance displayname"),
			Location:              pulumi.String("us-east4"),
			Project:               pulumi.String("my-project"),
			ExadataInfrastructure: cloudExadataInfrastructures.ID(),
			Network:               pulumi.String(_default.Id),
			Cidr:                  pulumi.String("10.5.0.0/24"),
			BackupSubnetCidr:      pulumi.String("10.6.0.0/24"),
			Properties: &oracledatabase.CloudVmClusterPropertiesArgs{
				LicenseType: pulumi.String("LICENSE_INCLUDED"),
				SshPublicKeys: pulumi.StringArray{
					pulumi.String("ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCz1X2744t+6vRLmE5u6nHi6/QWh8bQDgHmd+OIxRQIGA/IWUtCs2FnaCNZcqvZkaeyjk5v0lTA/n+9jvO42Ipib53athrfVG8gRt8fzPL66C6ZqHq+6zZophhrCdfJh/0G4x9xJh5gdMprlaCR1P8yAaVvhBQSKGc4SiIkyMNBcHJ5YTtMQMTfxaB4G1sHZ6SDAY9a6Cq/zNjDwfPapWLsiP4mRhE5SSjJX6l6EYbkm0JeLQg+AbJiNEPvrvDp1wtTxzlPJtIivthmLMThFxK7+DkrYFuLvN5AHUdo9KTDLvHtDCvV70r8v0gafsrKkM/OE9Jtzoo0e1N/5K/ZdyFRbAkFT4QSF3nwpbmBWLf2Evg//YyEuxnz4CwPqFST2mucnrCCGCVWp1vnHZ0y30nM35njLOmWdRDFy5l27pKUTwLp02y3UYiiZyP7d3/u5pKiN4vC27VuvzprSdJxWoAvluOiDeRh+/oeQDowxoT/Oop8DzB9uJmjktXw8jyMW2+Rpg+ENQqeNgF1OGlEzypaWiRskEFlkpLb4v/s3ZDYkL1oW0Nv/J8LTjTOTEaYt2Udjoe9x2xWiGnQixhdChWuG+MaoWffzUgx1tsVj/DBXijR5DjkPkrA1GA98zd3q8GKEaAdcDenJjHhNYSd4+rE9pIsnYn7fo5X/tFfcQH1XQ== nobody@google.com"),
				},
				CpuCoreCount:   pulumi.Int(4),
				GiVersion:      pulumi.String("19.0.0.0"),
				HostnamePrefix: pulumi.String("hostname1"),
			},
			DeletionProtection: pulumi.Bool(true),
		})
		if err != nil {
			return err
		}
		return nil
	})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;

return await Deployment.RunAsync(() => 
{
    var cloudExadataInfrastructures = new Gcp.OracleDatabase.CloudExadataInfrastructure("cloudExadataInfrastructures", new()
    {
        CloudExadataInfrastructureId = "my-exadata",
        DisplayName = "my-exadata displayname",
        Location = "us-east4",
        Project = "my-project",
        Properties = new Gcp.OracleDatabase.Inputs.CloudExadataInfrastructurePropertiesArgs
        {
            Shape = "Exadata.X9M",
            ComputeCount = 2,
            StorageCount = 3,
        },
        DeletionProtection = true,
    });

    var @default = Gcp.Compute.GetNetwork.Invoke(new()
    {
        Name = "new",
        Project = "my-project",
    });

    var myVmcluster = new Gcp.OracleDatabase.CloudVmCluster("my_vmcluster", new()
    {
        CloudVmClusterId = "my-instance",
        DisplayName = "my-instance displayname",
        Location = "us-east4",
        Project = "my-project",
        ExadataInfrastructure = cloudExadataInfrastructures.Id,
        Network = @default.Apply(@default => @default.Apply(getNetworkResult => getNetworkResult.Id)),
        Cidr = "10.5.0.0/24",
        BackupSubnetCidr = "10.6.0.0/24",
        Properties = new Gcp.OracleDatabase.Inputs.CloudVmClusterPropertiesArgs
        {
            LicenseType = "LICENSE_INCLUDED",
            SshPublicKeys = new[]
            {
                "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCz1X2744t+6vRLmE5u6nHi6/QWh8bQDgHmd+OIxRQIGA/IWUtCs2FnaCNZcqvZkaeyjk5v0lTA/n+9jvO42Ipib53athrfVG8gRt8fzPL66C6ZqHq+6zZophhrCdfJh/0G4x9xJh5gdMprlaCR1P8yAaVvhBQSKGc4SiIkyMNBcHJ5YTtMQMTfxaB4G1sHZ6SDAY9a6Cq/zNjDwfPapWLsiP4mRhE5SSjJX6l6EYbkm0JeLQg+AbJiNEPvrvDp1wtTxzlPJtIivthmLMThFxK7+DkrYFuLvN5AHUdo9KTDLvHtDCvV70r8v0gafsrKkM/OE9Jtzoo0e1N/5K/ZdyFRbAkFT4QSF3nwpbmBWLf2Evg//YyEuxnz4CwPqFST2mucnrCCGCVWp1vnHZ0y30nM35njLOmWdRDFy5l27pKUTwLp02y3UYiiZyP7d3/u5pKiN4vC27VuvzprSdJxWoAvluOiDeRh+/oeQDowxoT/Oop8DzB9uJmjktXw8jyMW2+Rpg+ENQqeNgF1OGlEzypaWiRskEFlkpLb4v/s3ZDYkL1oW0Nv/J8LTjTOTEaYt2Udjoe9x2xWiGnQixhdChWuG+MaoWffzUgx1tsVj/DBXijR5DjkPkrA1GA98zd3q8GKEaAdcDenJjHhNYSd4+rE9pIsnYn7fo5X/tFfcQH1XQ== nobody@google.com",
            },
            CpuCoreCount = 4,
            GiVersion = "19.0.0.0",
            HostnamePrefix = "hostname1",
        },
        DeletionProtection = true,
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.oracledatabase.CloudExadataInfrastructure;
import com.pulumi.gcp.oracledatabase.CloudExadataInfrastructureArgs;
import com.pulumi.gcp.oracledatabase.inputs.CloudExadataInfrastructurePropertiesArgs;
import com.pulumi.gcp.compute.ComputeFunctions;
import com.pulumi.gcp.compute.inputs.GetNetworkArgs;
import com.pulumi.gcp.oracledatabase.CloudVmCluster;
import com.pulumi.gcp.oracledatabase.CloudVmClusterArgs;
import com.pulumi.gcp.oracledatabase.inputs.CloudVmClusterPropertiesArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;

public class App {
    public static void main(String[] args) {
        Pulumi.run(App::stack);
    }

    public static void stack(Context ctx) {
        var cloudExadataInfrastructures = new CloudExadataInfrastructure("cloudExadataInfrastructures", CloudExadataInfrastructureArgs.builder()
            .cloudExadataInfrastructureId("my-exadata")
            .displayName("my-exadata displayname")
            .location("us-east4")
            .project("my-project")
            .properties(CloudExadataInfrastructurePropertiesArgs.builder()
                .shape("Exadata.X9M")
                .computeCount(2)
                .storageCount(3)
                .build())
            .deletionProtection(true)
            .build());

        final var default = ComputeFunctions.getNetwork(GetNetworkArgs.builder()
            .name("new")
            .project("my-project")
            .build());

        var myVmcluster = new CloudVmCluster("myVmcluster", CloudVmClusterArgs.builder()
            .cloudVmClusterId("my-instance")
            .displayName("my-instance displayname")
            .location("us-east4")
            .project("my-project")
            .exadataInfrastructure(cloudExadataInfrastructures.id())
            .network(default_.id())
            .cidr("10.5.0.0/24")
            .backupSubnetCidr("10.6.0.0/24")
            .properties(CloudVmClusterPropertiesArgs.builder()
                .licenseType("LICENSE_INCLUDED")
                .sshPublicKeys("ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCz1X2744t+6vRLmE5u6nHi6/QWh8bQDgHmd+OIxRQIGA/IWUtCs2FnaCNZcqvZkaeyjk5v0lTA/n+9jvO42Ipib53athrfVG8gRt8fzPL66C6ZqHq+6zZophhrCdfJh/0G4x9xJh5gdMprlaCR1P8yAaVvhBQSKGc4SiIkyMNBcHJ5YTtMQMTfxaB4G1sHZ6SDAY9a6Cq/zNjDwfPapWLsiP4mRhE5SSjJX6l6EYbkm0JeLQg+AbJiNEPvrvDp1wtTxzlPJtIivthmLMThFxK7+DkrYFuLvN5AHUdo9KTDLvHtDCvV70r8v0gafsrKkM/OE9Jtzoo0e1N/5K/ZdyFRbAkFT4QSF3nwpbmBWLf2Evg//YyEuxnz4CwPqFST2mucnrCCGCVWp1vnHZ0y30nM35njLOmWdRDFy5l27pKUTwLp02y3UYiiZyP7d3/u5pKiN4vC27VuvzprSdJxWoAvluOiDeRh+/oeQDowxoT/Oop8DzB9uJmjktXw8jyMW2+Rpg+ENQqeNgF1OGlEzypaWiRskEFlkpLb4v/s3ZDYkL1oW0Nv/J8LTjTOTEaYt2Udjoe9x2xWiGnQixhdChWuG+MaoWffzUgx1tsVj/DBXijR5DjkPkrA1GA98zd3q8GKEaAdcDenJjHhNYSd4+rE9pIsnYn7fo5X/tFfcQH1XQ== nobody@google.com")
                .cpuCoreCount(4)
                .giVersion("19.0.0.0")
                .hostnamePrefix("hostname1")
                .build())
            .deletionProtection(true)
            .build());

    }
}
resources:
  myVmcluster:
    type: gcp:oracledatabase:CloudVmCluster
    name: my_vmcluster
    properties:
      cloudVmClusterId: my-instance
      displayName: my-instance displayname
      location: us-east4
      project: my-project
      exadataInfrastructure: ${cloudExadataInfrastructures.id}
      network: ${default.id}
      cidr: 10.5.0.0/24
      backupSubnetCidr: 10.6.0.0/24
      properties:
        licenseType: LICENSE_INCLUDED
        sshPublicKeys:
          - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCz1X2744t+6vRLmE5u6nHi6/QWh8bQDgHmd+OIxRQIGA/IWUtCs2FnaCNZcqvZkaeyjk5v0lTA/n+9jvO42Ipib53athrfVG8gRt8fzPL66C6ZqHq+6zZophhrCdfJh/0G4x9xJh5gdMprlaCR1P8yAaVvhBQSKGc4SiIkyMNBcHJ5YTtMQMTfxaB4G1sHZ6SDAY9a6Cq/zNjDwfPapWLsiP4mRhE5SSjJX6l6EYbkm0JeLQg+AbJiNEPvrvDp1wtTxzlPJtIivthmLMThFxK7+DkrYFuLvN5AHUdo9KTDLvHtDCvV70r8v0gafsrKkM/OE9Jtzoo0e1N/5K/ZdyFRbAkFT4QSF3nwpbmBWLf2Evg//YyEuxnz4CwPqFST2mucnrCCGCVWp1vnHZ0y30nM35njLOmWdRDFy5l27pKUTwLp02y3UYiiZyP7d3/u5pKiN4vC27VuvzprSdJxWoAvluOiDeRh+/oeQDowxoT/Oop8DzB9uJmjktXw8jyMW2+Rpg+ENQqeNgF1OGlEzypaWiRskEFlkpLb4v/s3ZDYkL1oW0Nv/J8LTjTOTEaYt2Udjoe9x2xWiGnQixhdChWuG+MaoWffzUgx1tsVj/DBXijR5DjkPkrA1GA98zd3q8GKEaAdcDenJjHhNYSd4+rE9pIsnYn7fo5X/tFfcQH1XQ== nobody@google.com
        cpuCoreCount: '4'
        giVersion: 19.0.0.0
        hostnamePrefix: hostname1
      deletionProtection: 'true'
  cloudExadataInfrastructures:
    type: gcp:oracledatabase:CloudExadataInfrastructure
    properties:
      cloudExadataInfrastructureId: my-exadata
      displayName: my-exadata displayname
      location: us-east4
      project: my-project
      properties:
        shape: Exadata.X9M
        computeCount: '2'
        storageCount: '3'
      deletionProtection: 'true'
variables:
  default:
    fn::invoke:
      function: gcp:compute:getNetwork
      arguments:
        name: new
        project: my-project

The exadataInfrastructure property references the Exadata infrastructure where the cluster runs. The network property points to your VPC, while cidr and backupSubnetCidr define IP allocation ranges for the cluster and backup traffic. Inside properties, cpuCoreCount sets the number of CPU cores per node, giVersion specifies the Oracle Grid Infrastructure version, and sshPublicKeys enables SSH access to cluster nodes.

Connect to Oracle Database Network resources

Some deployments use Oracle Database Network (OdbNetwork) resources for IP allocation instead of VPC networks, providing Oracle-specific network isolation.

import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";

const cloudExadataInfrastructures = new gcp.oracledatabase.CloudExadataInfrastructure("cloudExadataInfrastructures", {
    cloudExadataInfrastructureId: "my-exadata",
    displayName: "my-exadata displayname",
    location: "europe-west2",
    project: "my-project",
    properties: {
        shape: "Exadata.X9M",
        computeCount: 2,
        storageCount: 3,
    },
    deletionProtection: true,
});
const myVmcluster = new gcp.oracledatabase.CloudVmCluster("my_vmcluster", {
    cloudVmClusterId: "my-instance",
    displayName: "my-instance displayname",
    location: "europe-west2",
    project: "my-project",
    exadataInfrastructure: cloudExadataInfrastructures.id,
    odbNetwork: "projects/my-project/locations/europe-west2/odbNetworks/my-odbnetwork",
    odbSubnet: "projects/my-project/locations/europe-west2/odbNetworks/my-odbnetwork/odbSubnets/my-odbsubnet",
    backupOdbSubnet: "projects/my-project/locations/europe-west2/odbNetworks/my-odbnetwork/odbSubnets/my-backup-odbsubnet",
    properties: {
        licenseType: "LICENSE_INCLUDED",
        sshPublicKeys: ["ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCz1X2744t+6vRLmE5u6nHi6/QWh8bQDgHmd+OIxRQIGA/IWUtCs2FnaCNZcqvZkaeyjk5v0lTA/n+9jvO42Ipib53athrfVG8gRt8fzPL66C6ZqHq+6zZophhrCdfJh/0G4x9xJh5gdMprlaCR1P8yAaVvhBQSKGc4SiIkyMNBcHJ5YTtMQMTfxaB4G1sHZ6SDAY9a6Cq/zNjDwfPapWLsiP4mRhE5SSjJX6l6EYbkm0JeLQg+AbJiNEPvrvDp1wtTxzlPJtIivthmLMThFxK7+DkrYFuLvN5AHUdo9KTDLvHtDCvV70r8v0gafsrKkM/OE9Jtzoo0e1N/5K/ZdyFRbAkFT4QSF3nwpbmBWLf2Evg//YyEuxnz4CwPqFST2mucnrCCGCVWp1vnHZ0y30nM35njLOmWdRDFy5l27pKUTwLp02y3UYiiZyP7d3/u5pKiN4vC27VuvzprSdJxWoAvluOiDeRh+/oeQDowxoT/Oop8DzB9uJmjktXw8jyMW2+Rpg+ENQqeNgF1OGlEzypaWiRskEFlkpLb4v/s3ZDYkL1oW0Nv/J8LTjTOTEaYt2Udjoe9x2xWiGnQixhdChWuG+MaoWffzUgx1tsVj/DBXijR5DjkPkrA1GA98zd3q8GKEaAdcDenJjHhNYSd4+rE9pIsnYn7fo5X/tFfcQH1XQ== nobody@google.com"],
        cpuCoreCount: 4,
        giVersion: "19.0.0.0",
        hostnamePrefix: "hostname1",
    },
    deletionProtection: true,
});
import pulumi
import pulumi_gcp as gcp

cloud_exadata_infrastructures = gcp.oracledatabase.CloudExadataInfrastructure("cloudExadataInfrastructures",
    cloud_exadata_infrastructure_id="my-exadata",
    display_name="my-exadata displayname",
    location="europe-west2",
    project="my-project",
    properties={
        "shape": "Exadata.X9M",
        "compute_count": 2,
        "storage_count": 3,
    },
    deletion_protection=True)
my_vmcluster = gcp.oracledatabase.CloudVmCluster("my_vmcluster",
    cloud_vm_cluster_id="my-instance",
    display_name="my-instance displayname",
    location="europe-west2",
    project="my-project",
    exadata_infrastructure=cloud_exadata_infrastructures.id,
    odb_network="projects/my-project/locations/europe-west2/odbNetworks/my-odbnetwork",
    odb_subnet="projects/my-project/locations/europe-west2/odbNetworks/my-odbnetwork/odbSubnets/my-odbsubnet",
    backup_odb_subnet="projects/my-project/locations/europe-west2/odbNetworks/my-odbnetwork/odbSubnets/my-backup-odbsubnet",
    properties={
        "license_type": "LICENSE_INCLUDED",
        "ssh_public_keys": ["ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCz1X2744t+6vRLmE5u6nHi6/QWh8bQDgHmd+OIxRQIGA/IWUtCs2FnaCNZcqvZkaeyjk5v0lTA/n+9jvO42Ipib53athrfVG8gRt8fzPL66C6ZqHq+6zZophhrCdfJh/0G4x9xJh5gdMprlaCR1P8yAaVvhBQSKGc4SiIkyMNBcHJ5YTtMQMTfxaB4G1sHZ6SDAY9a6Cq/zNjDwfPapWLsiP4mRhE5SSjJX6l6EYbkm0JeLQg+AbJiNEPvrvDp1wtTxzlPJtIivthmLMThFxK7+DkrYFuLvN5AHUdo9KTDLvHtDCvV70r8v0gafsrKkM/OE9Jtzoo0e1N/5K/ZdyFRbAkFT4QSF3nwpbmBWLf2Evg//YyEuxnz4CwPqFST2mucnrCCGCVWp1vnHZ0y30nM35njLOmWdRDFy5l27pKUTwLp02y3UYiiZyP7d3/u5pKiN4vC27VuvzprSdJxWoAvluOiDeRh+/oeQDowxoT/Oop8DzB9uJmjktXw8jyMW2+Rpg+ENQqeNgF1OGlEzypaWiRskEFlkpLb4v/s3ZDYkL1oW0Nv/J8LTjTOTEaYt2Udjoe9x2xWiGnQixhdChWuG+MaoWffzUgx1tsVj/DBXijR5DjkPkrA1GA98zd3q8GKEaAdcDenJjHhNYSd4+rE9pIsnYn7fo5X/tFfcQH1XQ== nobody@google.com"],
        "cpu_core_count": 4,
        "gi_version": "19.0.0.0",
        "hostname_prefix": "hostname1",
    },
    deletion_protection=True)
package main

import (
	"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/oracledatabase"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		cloudExadataInfrastructures, err := oracledatabase.NewCloudExadataInfrastructure(ctx, "cloudExadataInfrastructures", &oracledatabase.CloudExadataInfrastructureArgs{
			CloudExadataInfrastructureId: pulumi.String("my-exadata"),
			DisplayName:                  pulumi.String("my-exadata displayname"),
			Location:                     pulumi.String("europe-west2"),
			Project:                      pulumi.String("my-project"),
			Properties: &oracledatabase.CloudExadataInfrastructurePropertiesArgs{
				Shape:        pulumi.String("Exadata.X9M"),
				ComputeCount: pulumi.Int(2),
				StorageCount: pulumi.Int(3),
			},
			DeletionProtection: pulumi.Bool(true),
		})
		if err != nil {
			return err
		}
		_, err = oracledatabase.NewCloudVmCluster(ctx, "my_vmcluster", &oracledatabase.CloudVmClusterArgs{
			CloudVmClusterId:      pulumi.String("my-instance"),
			DisplayName:           pulumi.String("my-instance displayname"),
			Location:              pulumi.String("europe-west2"),
			Project:               pulumi.String("my-project"),
			ExadataInfrastructure: cloudExadataInfrastructures.ID(),
			OdbNetwork:            pulumi.String("projects/my-project/locations/europe-west2/odbNetworks/my-odbnetwork"),
			OdbSubnet:             pulumi.String("projects/my-project/locations/europe-west2/odbNetworks/my-odbnetwork/odbSubnets/my-odbsubnet"),
			BackupOdbSubnet:       pulumi.String("projects/my-project/locations/europe-west2/odbNetworks/my-odbnetwork/odbSubnets/my-backup-odbsubnet"),
			Properties: &oracledatabase.CloudVmClusterPropertiesArgs{
				LicenseType: pulumi.String("LICENSE_INCLUDED"),
				SshPublicKeys: pulumi.StringArray{
					pulumi.String("ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCz1X2744t+6vRLmE5u6nHi6/QWh8bQDgHmd+OIxRQIGA/IWUtCs2FnaCNZcqvZkaeyjk5v0lTA/n+9jvO42Ipib53athrfVG8gRt8fzPL66C6ZqHq+6zZophhrCdfJh/0G4x9xJh5gdMprlaCR1P8yAaVvhBQSKGc4SiIkyMNBcHJ5YTtMQMTfxaB4G1sHZ6SDAY9a6Cq/zNjDwfPapWLsiP4mRhE5SSjJX6l6EYbkm0JeLQg+AbJiNEPvrvDp1wtTxzlPJtIivthmLMThFxK7+DkrYFuLvN5AHUdo9KTDLvHtDCvV70r8v0gafsrKkM/OE9Jtzoo0e1N/5K/ZdyFRbAkFT4QSF3nwpbmBWLf2Evg//YyEuxnz4CwPqFST2mucnrCCGCVWp1vnHZ0y30nM35njLOmWdRDFy5l27pKUTwLp02y3UYiiZyP7d3/u5pKiN4vC27VuvzprSdJxWoAvluOiDeRh+/oeQDowxoT/Oop8DzB9uJmjktXw8jyMW2+Rpg+ENQqeNgF1OGlEzypaWiRskEFlkpLb4v/s3ZDYkL1oW0Nv/J8LTjTOTEaYt2Udjoe9x2xWiGnQixhdChWuG+MaoWffzUgx1tsVj/DBXijR5DjkPkrA1GA98zd3q8GKEaAdcDenJjHhNYSd4+rE9pIsnYn7fo5X/tFfcQH1XQ== nobody@google.com"),
				},
				CpuCoreCount:   pulumi.Int(4),
				GiVersion:      pulumi.String("19.0.0.0"),
				HostnamePrefix: pulumi.String("hostname1"),
			},
			DeletionProtection: pulumi.Bool(true),
		})
		if err != nil {
			return err
		}
		return nil
	})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;

return await Deployment.RunAsync(() => 
{
    var cloudExadataInfrastructures = new Gcp.OracleDatabase.CloudExadataInfrastructure("cloudExadataInfrastructures", new()
    {
        CloudExadataInfrastructureId = "my-exadata",
        DisplayName = "my-exadata displayname",
        Location = "europe-west2",
        Project = "my-project",
        Properties = new Gcp.OracleDatabase.Inputs.CloudExadataInfrastructurePropertiesArgs
        {
            Shape = "Exadata.X9M",
            ComputeCount = 2,
            StorageCount = 3,
        },
        DeletionProtection = true,
    });

    var myVmcluster = new Gcp.OracleDatabase.CloudVmCluster("my_vmcluster", new()
    {
        CloudVmClusterId = "my-instance",
        DisplayName = "my-instance displayname",
        Location = "europe-west2",
        Project = "my-project",
        ExadataInfrastructure = cloudExadataInfrastructures.Id,
        OdbNetwork = "projects/my-project/locations/europe-west2/odbNetworks/my-odbnetwork",
        OdbSubnet = "projects/my-project/locations/europe-west2/odbNetworks/my-odbnetwork/odbSubnets/my-odbsubnet",
        BackupOdbSubnet = "projects/my-project/locations/europe-west2/odbNetworks/my-odbnetwork/odbSubnets/my-backup-odbsubnet",
        Properties = new Gcp.OracleDatabase.Inputs.CloudVmClusterPropertiesArgs
        {
            LicenseType = "LICENSE_INCLUDED",
            SshPublicKeys = new[]
            {
                "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCz1X2744t+6vRLmE5u6nHi6/QWh8bQDgHmd+OIxRQIGA/IWUtCs2FnaCNZcqvZkaeyjk5v0lTA/n+9jvO42Ipib53athrfVG8gRt8fzPL66C6ZqHq+6zZophhrCdfJh/0G4x9xJh5gdMprlaCR1P8yAaVvhBQSKGc4SiIkyMNBcHJ5YTtMQMTfxaB4G1sHZ6SDAY9a6Cq/zNjDwfPapWLsiP4mRhE5SSjJX6l6EYbkm0JeLQg+AbJiNEPvrvDp1wtTxzlPJtIivthmLMThFxK7+DkrYFuLvN5AHUdo9KTDLvHtDCvV70r8v0gafsrKkM/OE9Jtzoo0e1N/5K/ZdyFRbAkFT4QSF3nwpbmBWLf2Evg//YyEuxnz4CwPqFST2mucnrCCGCVWp1vnHZ0y30nM35njLOmWdRDFy5l27pKUTwLp02y3UYiiZyP7d3/u5pKiN4vC27VuvzprSdJxWoAvluOiDeRh+/oeQDowxoT/Oop8DzB9uJmjktXw8jyMW2+Rpg+ENQqeNgF1OGlEzypaWiRskEFlkpLb4v/s3ZDYkL1oW0Nv/J8LTjTOTEaYt2Udjoe9x2xWiGnQixhdChWuG+MaoWffzUgx1tsVj/DBXijR5DjkPkrA1GA98zd3q8GKEaAdcDenJjHhNYSd4+rE9pIsnYn7fo5X/tFfcQH1XQ== nobody@google.com",
            },
            CpuCoreCount = 4,
            GiVersion = "19.0.0.0",
            HostnamePrefix = "hostname1",
        },
        DeletionProtection = true,
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.oracledatabase.CloudExadataInfrastructure;
import com.pulumi.gcp.oracledatabase.CloudExadataInfrastructureArgs;
import com.pulumi.gcp.oracledatabase.inputs.CloudExadataInfrastructurePropertiesArgs;
import com.pulumi.gcp.oracledatabase.CloudVmCluster;
import com.pulumi.gcp.oracledatabase.CloudVmClusterArgs;
import com.pulumi.gcp.oracledatabase.inputs.CloudVmClusterPropertiesArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;

public class App {
    public static void main(String[] args) {
        Pulumi.run(App::stack);
    }

    public static void stack(Context ctx) {
        var cloudExadataInfrastructures = new CloudExadataInfrastructure("cloudExadataInfrastructures", CloudExadataInfrastructureArgs.builder()
            .cloudExadataInfrastructureId("my-exadata")
            .displayName("my-exadata displayname")
            .location("europe-west2")
            .project("my-project")
            .properties(CloudExadataInfrastructurePropertiesArgs.builder()
                .shape("Exadata.X9M")
                .computeCount(2)
                .storageCount(3)
                .build())
            .deletionProtection(true)
            .build());

        var myVmcluster = new CloudVmCluster("myVmcluster", CloudVmClusterArgs.builder()
            .cloudVmClusterId("my-instance")
            .displayName("my-instance displayname")
            .location("europe-west2")
            .project("my-project")
            .exadataInfrastructure(cloudExadataInfrastructures.id())
            .odbNetwork("projects/my-project/locations/europe-west2/odbNetworks/my-odbnetwork")
            .odbSubnet("projects/my-project/locations/europe-west2/odbNetworks/my-odbnetwork/odbSubnets/my-odbsubnet")
            .backupOdbSubnet("projects/my-project/locations/europe-west2/odbNetworks/my-odbnetwork/odbSubnets/my-backup-odbsubnet")
            .properties(CloudVmClusterPropertiesArgs.builder()
                .licenseType("LICENSE_INCLUDED")
                .sshPublicKeys("ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCz1X2744t+6vRLmE5u6nHi6/QWh8bQDgHmd+OIxRQIGA/IWUtCs2FnaCNZcqvZkaeyjk5v0lTA/n+9jvO42Ipib53athrfVG8gRt8fzPL66C6ZqHq+6zZophhrCdfJh/0G4x9xJh5gdMprlaCR1P8yAaVvhBQSKGc4SiIkyMNBcHJ5YTtMQMTfxaB4G1sHZ6SDAY9a6Cq/zNjDwfPapWLsiP4mRhE5SSjJX6l6EYbkm0JeLQg+AbJiNEPvrvDp1wtTxzlPJtIivthmLMThFxK7+DkrYFuLvN5AHUdo9KTDLvHtDCvV70r8v0gafsrKkM/OE9Jtzoo0e1N/5K/ZdyFRbAkFT4QSF3nwpbmBWLf2Evg//YyEuxnz4CwPqFST2mucnrCCGCVWp1vnHZ0y30nM35njLOmWdRDFy5l27pKUTwLp02y3UYiiZyP7d3/u5pKiN4vC27VuvzprSdJxWoAvluOiDeRh+/oeQDowxoT/Oop8DzB9uJmjktXw8jyMW2+Rpg+ENQqeNgF1OGlEzypaWiRskEFlkpLb4v/s3ZDYkL1oW0Nv/J8LTjTOTEaYt2Udjoe9x2xWiGnQixhdChWuG+MaoWffzUgx1tsVj/DBXijR5DjkPkrA1GA98zd3q8GKEaAdcDenJjHhNYSd4+rE9pIsnYn7fo5X/tFfcQH1XQ== nobody@google.com")
                .cpuCoreCount(4)
                .giVersion("19.0.0.0")
                .hostnamePrefix("hostname1")
                .build())
            .deletionProtection(true)
            .build());

    }
}
resources:
  myVmcluster:
    type: gcp:oracledatabase:CloudVmCluster
    name: my_vmcluster
    properties:
      cloudVmClusterId: my-instance
      displayName: my-instance displayname
      location: europe-west2
      project: my-project
      exadataInfrastructure: ${cloudExadataInfrastructures.id}
      odbNetwork: projects/my-project/locations/europe-west2/odbNetworks/my-odbnetwork
      odbSubnet: projects/my-project/locations/europe-west2/odbNetworks/my-odbnetwork/odbSubnets/my-odbsubnet
      backupOdbSubnet: projects/my-project/locations/europe-west2/odbNetworks/my-odbnetwork/odbSubnets/my-backup-odbsubnet
      properties:
        licenseType: LICENSE_INCLUDED
        sshPublicKeys:
          - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCz1X2744t+6vRLmE5u6nHi6/QWh8bQDgHmd+OIxRQIGA/IWUtCs2FnaCNZcqvZkaeyjk5v0lTA/n+9jvO42Ipib53athrfVG8gRt8fzPL66C6ZqHq+6zZophhrCdfJh/0G4x9xJh5gdMprlaCR1P8yAaVvhBQSKGc4SiIkyMNBcHJ5YTtMQMTfxaB4G1sHZ6SDAY9a6Cq/zNjDwfPapWLsiP4mRhE5SSjJX6l6EYbkm0JeLQg+AbJiNEPvrvDp1wtTxzlPJtIivthmLMThFxK7+DkrYFuLvN5AHUdo9KTDLvHtDCvV70r8v0gafsrKkM/OE9Jtzoo0e1N/5K/ZdyFRbAkFT4QSF3nwpbmBWLf2Evg//YyEuxnz4CwPqFST2mucnrCCGCVWp1vnHZ0y30nM35njLOmWdRDFy5l27pKUTwLp02y3UYiiZyP7d3/u5pKiN4vC27VuvzprSdJxWoAvluOiDeRh+/oeQDowxoT/Oop8DzB9uJmjktXw8jyMW2+Rpg+ENQqeNgF1OGlEzypaWiRskEFlkpLb4v/s3ZDYkL1oW0Nv/J8LTjTOTEaYt2Udjoe9x2xWiGnQixhdChWuG+MaoWffzUgx1tsVj/DBXijR5DjkPkrA1GA98zd3q8GKEaAdcDenJjHhNYSd4+rE9pIsnYn7fo5X/tFfcQH1XQ== nobody@google.com
        cpuCoreCount: '4'
        giVersion: 19.0.0.0
        hostnamePrefix: hostname1
      deletionProtection: 'true'
  cloudExadataInfrastructures:
    type: gcp:oracledatabase:CloudExadataInfrastructure
    properties:
      cloudExadataInfrastructureId: my-exadata
      displayName: my-exadata displayname
      location: europe-west2
      project: my-project
      properties:
        shape: Exadata.X9M
        computeCount: '2'
        storageCount: '3'
      deletionProtection: 'true'

The odbNetwork, odbSubnet, and backupOdbSubnet properties replace VPC-based networking. This approach uses Oracle-managed subnets for both primary and backup traffic. The odbNetwork property must match the parent network of the specified subnets.

Configure advanced cluster topology and diagnostics

Production deployments often require precise control over node count, storage allocation, and diagnostic collection.

import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";

const cloudExadataInfrastructures = new gcp.oracledatabase.CloudExadataInfrastructure("cloudExadataInfrastructures", {
    cloudExadataInfrastructureId: "my-exadata",
    displayName: "my-exadata displayname",
    location: "us-east4",
    project: "my-project",
    properties: {
        shape: "Exadata.X9M",
        computeCount: 2,
        storageCount: 3,
    },
    deletionProtection: true,
});
const _default = gcp.compute.getNetwork({
    name: "new",
    project: "my-project",
});
const mydbserver = gcp.oracledatabase.getDbServersOutput({
    location: "us-east4",
    project: "my-project",
    cloudExadataInfrastructure: cloudExadataInfrastructures.cloudExadataInfrastructureId,
});
const myVmcluster = new gcp.oracledatabase.CloudVmCluster("my_vmcluster", {
    cloudVmClusterId: "my-instance",
    displayName: "my-instance displayname",
    location: "us-east4",
    project: "my-project",
    exadataInfrastructure: cloudExadataInfrastructures.id,
    network: _default.then(_default => _default.id),
    cidr: "10.5.0.0/24",
    backupSubnetCidr: "10.6.0.0/24",
    labels: {
        "label-one": "value-one",
    },
    properties: {
        licenseType: "LICENSE_INCLUDED",
        sshPublicKeys: ["ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCz1X2744t+6vRLmE5u6nHi6/QWh8bQDgHmd+OIxRQIGA/IWUtCs2FnaCNZcqvZkaeyjk5v0lTA/n+9jvO42Ipib53athrfVG8gRt8fzPL66C6ZqHq+6zZophhrCdfJh/0G4x9xJh5gdMprlaCR1P8yAaVvhBQSKGc4SiIkyMNBcHJ5YTtMQMTfxaB4G1sHZ6SDAY9a6Cq/zNjDwfPapWLsiP4mRhE5SSjJX6l6EYbkm0JeLQg+AbJiNEPvrvDp1wtTxzlPJtIivthmLMThFxK7+DkrYFuLvN5AHUdo9KTDLvHtDCvV70r8v0gafsrKkM/OE9Jtzoo0e1N/5K/ZdyFRbAkFT4QSF3nwpbmBWLf2Evg//YyEuxnz4CwPqFST2mucnrCCGCVWp1vnHZ0y30nM35njLOmWdRDFy5l27pKUTwLp02y3UYiiZyP7d3/u5pKiN4vC27VuvzprSdJxWoAvluOiDeRh+/oeQDowxoT/Oop8DzB9uJmjktXw8jyMW2+Rpg+ENQqeNgF1OGlEzypaWiRskEFlkpLb4v/s3ZDYkL1oW0Nv/J8LTjTOTEaYt2Udjoe9x2xWiGnQixhdChWuG+MaoWffzUgx1tsVj/DBXijR5DjkPkrA1GA98zd3q8GKEaAdcDenJjHhNYSd4+rE9pIsnYn7fo5X/tFfcQH1XQ== nobody@google.com"],
        cpuCoreCount: 4,
        giVersion: "19.0.0.0",
        timeZone: {
            id: "UTC",
        },
        nodeCount: 2,
        ocpuCount: 4,
        dataStorageSizeTb: 2,
        dbNodeStorageSizeGb: 120,
        dbServerOcids: [
            mydbserver.apply(mydbserver => mydbserver.dbServers?.[0]?.properties?.[0]?.ocid),
            mydbserver.apply(mydbserver => mydbserver.dbServers?.[1]?.properties?.[0]?.ocid),
        ],
        diskRedundancy: "HIGH",
        sparseDiskgroupEnabled: false,
        localBackupEnabled: false,
        clusterName: "pq-ppat4",
        hostnamePrefix: "hostname1",
        diagnosticsDataCollectionOptions: {
            diagnosticsEventsEnabled: true,
            healthMonitoringEnabled: true,
            incidentLogsEnabled: true,
        },
        memorySizeGb: 60,
    },
    deletionProtection: true,
});
import pulumi
import pulumi_gcp as gcp

cloud_exadata_infrastructures = gcp.oracledatabase.CloudExadataInfrastructure("cloudExadataInfrastructures",
    cloud_exadata_infrastructure_id="my-exadata",
    display_name="my-exadata displayname",
    location="us-east4",
    project="my-project",
    properties={
        "shape": "Exadata.X9M",
        "compute_count": 2,
        "storage_count": 3,
    },
    deletion_protection=True)
default = gcp.compute.get_network(name="new",
    project="my-project")
mydbserver = gcp.oracledatabase.get_db_servers_output(location="us-east4",
    project="my-project",
    cloud_exadata_infrastructure=cloud_exadata_infrastructures.cloud_exadata_infrastructure_id)
my_vmcluster = gcp.oracledatabase.CloudVmCluster("my_vmcluster",
    cloud_vm_cluster_id="my-instance",
    display_name="my-instance displayname",
    location="us-east4",
    project="my-project",
    exadata_infrastructure=cloud_exadata_infrastructures.id,
    network=default.id,
    cidr="10.5.0.0/24",
    backup_subnet_cidr="10.6.0.0/24",
    labels={
        "label-one": "value-one",
    },
    properties={
        "license_type": "LICENSE_INCLUDED",
        "ssh_public_keys": ["ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCz1X2744t+6vRLmE5u6nHi6/QWh8bQDgHmd+OIxRQIGA/IWUtCs2FnaCNZcqvZkaeyjk5v0lTA/n+9jvO42Ipib53athrfVG8gRt8fzPL66C6ZqHq+6zZophhrCdfJh/0G4x9xJh5gdMprlaCR1P8yAaVvhBQSKGc4SiIkyMNBcHJ5YTtMQMTfxaB4G1sHZ6SDAY9a6Cq/zNjDwfPapWLsiP4mRhE5SSjJX6l6EYbkm0JeLQg+AbJiNEPvrvDp1wtTxzlPJtIivthmLMThFxK7+DkrYFuLvN5AHUdo9KTDLvHtDCvV70r8v0gafsrKkM/OE9Jtzoo0e1N/5K/ZdyFRbAkFT4QSF3nwpbmBWLf2Evg//YyEuxnz4CwPqFST2mucnrCCGCVWp1vnHZ0y30nM35njLOmWdRDFy5l27pKUTwLp02y3UYiiZyP7d3/u5pKiN4vC27VuvzprSdJxWoAvluOiDeRh+/oeQDowxoT/Oop8DzB9uJmjktXw8jyMW2+Rpg+ENQqeNgF1OGlEzypaWiRskEFlkpLb4v/s3ZDYkL1oW0Nv/J8LTjTOTEaYt2Udjoe9x2xWiGnQixhdChWuG+MaoWffzUgx1tsVj/DBXijR5DjkPkrA1GA98zd3q8GKEaAdcDenJjHhNYSd4+rE9pIsnYn7fo5X/tFfcQH1XQ== nobody@google.com"],
        "cpu_core_count": 4,
        "gi_version": "19.0.0.0",
        "time_zone": {
            "id": "UTC",
        },
        "node_count": 2,
        "ocpu_count": 4,
        "data_storage_size_tb": 2,
        "db_node_storage_size_gb": 120,
        "db_server_ocids": [
            mydbserver.db_servers[0].properties[0].ocid,
            mydbserver.db_servers[1].properties[0].ocid,
        ],
        "disk_redundancy": "HIGH",
        "sparse_diskgroup_enabled": False,
        "local_backup_enabled": False,
        "cluster_name": "pq-ppat4",
        "hostname_prefix": "hostname1",
        "diagnostics_data_collection_options": {
            "diagnostics_events_enabled": True,
            "health_monitoring_enabled": True,
            "incident_logs_enabled": True,
        },
        "memory_size_gb": 60,
    },
    deletion_protection=True)
package main

import (
	"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/compute"
	"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/oracledatabase"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		cloudExadataInfrastructures, err := oracledatabase.NewCloudExadataInfrastructure(ctx, "cloudExadataInfrastructures", &oracledatabase.CloudExadataInfrastructureArgs{
			CloudExadataInfrastructureId: pulumi.String("my-exadata"),
			DisplayName:                  pulumi.String("my-exadata displayname"),
			Location:                     pulumi.String("us-east4"),
			Project:                      pulumi.String("my-project"),
			Properties: &oracledatabase.CloudExadataInfrastructurePropertiesArgs{
				Shape:        pulumi.String("Exadata.X9M"),
				ComputeCount: pulumi.Int(2),
				StorageCount: pulumi.Int(3),
			},
			DeletionProtection: pulumi.Bool(true),
		})
		if err != nil {
			return err
		}
		_default, err := compute.LookupNetwork(ctx, &compute.LookupNetworkArgs{
			Name:    "new",
			Project: pulumi.StringRef("my-project"),
		}, nil)
		if err != nil {
			return err
		}
		mydbserver := oracledatabase.GetDbServersOutput(ctx, oracledatabase.GetDbServersOutputArgs{
			Location:                   pulumi.String("us-east4"),
			Project:                    pulumi.String("my-project"),
			CloudExadataInfrastructure: cloudExadataInfrastructures.CloudExadataInfrastructureId,
		}, nil)
		_, err = oracledatabase.NewCloudVmCluster(ctx, "my_vmcluster", &oracledatabase.CloudVmClusterArgs{
			CloudVmClusterId:      pulumi.String("my-instance"),
			DisplayName:           pulumi.String("my-instance displayname"),
			Location:              pulumi.String("us-east4"),
			Project:               pulumi.String("my-project"),
			ExadataInfrastructure: cloudExadataInfrastructures.ID(),
			Network:               pulumi.String(_default.Id),
			Cidr:                  pulumi.String("10.5.0.0/24"),
			BackupSubnetCidr:      pulumi.String("10.6.0.0/24"),
			Labels: pulumi.StringMap{
				"label-one": pulumi.String("value-one"),
			},
			Properties: &oracledatabase.CloudVmClusterPropertiesArgs{
				LicenseType: pulumi.String("LICENSE_INCLUDED"),
				SshPublicKeys: pulumi.StringArray{
					pulumi.String("ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCz1X2744t+6vRLmE5u6nHi6/QWh8bQDgHmd+OIxRQIGA/IWUtCs2FnaCNZcqvZkaeyjk5v0lTA/n+9jvO42Ipib53athrfVG8gRt8fzPL66C6ZqHq+6zZophhrCdfJh/0G4x9xJh5gdMprlaCR1P8yAaVvhBQSKGc4SiIkyMNBcHJ5YTtMQMTfxaB4G1sHZ6SDAY9a6Cq/zNjDwfPapWLsiP4mRhE5SSjJX6l6EYbkm0JeLQg+AbJiNEPvrvDp1wtTxzlPJtIivthmLMThFxK7+DkrYFuLvN5AHUdo9KTDLvHtDCvV70r8v0gafsrKkM/OE9Jtzoo0e1N/5K/ZdyFRbAkFT4QSF3nwpbmBWLf2Evg//YyEuxnz4CwPqFST2mucnrCCGCVWp1vnHZ0y30nM35njLOmWdRDFy5l27pKUTwLp02y3UYiiZyP7d3/u5pKiN4vC27VuvzprSdJxWoAvluOiDeRh+/oeQDowxoT/Oop8DzB9uJmjktXw8jyMW2+Rpg+ENQqeNgF1OGlEzypaWiRskEFlkpLb4v/s3ZDYkL1oW0Nv/J8LTjTOTEaYt2Udjoe9x2xWiGnQixhdChWuG+MaoWffzUgx1tsVj/DBXijR5DjkPkrA1GA98zd3q8GKEaAdcDenJjHhNYSd4+rE9pIsnYn7fo5X/tFfcQH1XQ== nobody@google.com"),
				},
				CpuCoreCount: pulumi.Int(4),
				GiVersion:    pulumi.String("19.0.0.0"),
				TimeZone: &oracledatabase.CloudVmClusterPropertiesTimeZoneArgs{
					Id: pulumi.String("UTC"),
				},
				NodeCount:           pulumi.Int(2),
				OcpuCount:           pulumi.Float64(4),
				DataStorageSizeTb:   pulumi.Float64(2),
				DbNodeStorageSizeGb: pulumi.Int(120),
				DbServerOcids: pulumi.StringArray{
					mydbserver.ApplyT(func(mydbserver oracledatabase.GetDbServersResult) (*string, error) {
						return &mydbserver.DbServers[0].Properties[0].Ocid, nil
					}).(pulumi.StringPtrOutput),
					mydbserver.ApplyT(func(mydbserver oracledatabase.GetDbServersResult) (*string, error) {
						return &mydbserver.DbServers[1].Properties[0].Ocid, nil
					}).(pulumi.StringPtrOutput),
				},
				DiskRedundancy:         pulumi.String("HIGH"),
				SparseDiskgroupEnabled: pulumi.Bool(false),
				LocalBackupEnabled:     pulumi.Bool(false),
				ClusterName:            pulumi.String("pq-ppat4"),
				HostnamePrefix:         pulumi.String("hostname1"),
				DiagnosticsDataCollectionOptions: &oracledatabase.CloudVmClusterPropertiesDiagnosticsDataCollectionOptionsArgs{
					DiagnosticsEventsEnabled: pulumi.Bool(true),
					HealthMonitoringEnabled:  pulumi.Bool(true),
					IncidentLogsEnabled:      pulumi.Bool(true),
				},
				MemorySizeGb: pulumi.Int(60),
			},
			DeletionProtection: pulumi.Bool(true),
		})
		if err != nil {
			return err
		}
		return nil
	})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;

return await Deployment.RunAsync(() => 
{
    var cloudExadataInfrastructures = new Gcp.OracleDatabase.CloudExadataInfrastructure("cloudExadataInfrastructures", new()
    {
        CloudExadataInfrastructureId = "my-exadata",
        DisplayName = "my-exadata displayname",
        Location = "us-east4",
        Project = "my-project",
        Properties = new Gcp.OracleDatabase.Inputs.CloudExadataInfrastructurePropertiesArgs
        {
            Shape = "Exadata.X9M",
            ComputeCount = 2,
            StorageCount = 3,
        },
        DeletionProtection = true,
    });

    var @default = Gcp.Compute.GetNetwork.Invoke(new()
    {
        Name = "new",
        Project = "my-project",
    });

    var mydbserver = Gcp.OracleDatabase.GetDbServers.Invoke(new()
    {
        Location = "us-east4",
        Project = "my-project",
        CloudExadataInfrastructure = cloudExadataInfrastructures.CloudExadataInfrastructureId,
    });

    var myVmcluster = new Gcp.OracleDatabase.CloudVmCluster("my_vmcluster", new()
    {
        CloudVmClusterId = "my-instance",
        DisplayName = "my-instance displayname",
        Location = "us-east4",
        Project = "my-project",
        ExadataInfrastructure = cloudExadataInfrastructures.Id,
        Network = @default.Apply(@default => @default.Apply(getNetworkResult => getNetworkResult.Id)),
        Cidr = "10.5.0.0/24",
        BackupSubnetCidr = "10.6.0.0/24",
        Labels = 
        {
            { "label-one", "value-one" },
        },
        Properties = new Gcp.OracleDatabase.Inputs.CloudVmClusterPropertiesArgs
        {
            LicenseType = "LICENSE_INCLUDED",
            SshPublicKeys = new[]
            {
                "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCz1X2744t+6vRLmE5u6nHi6/QWh8bQDgHmd+OIxRQIGA/IWUtCs2FnaCNZcqvZkaeyjk5v0lTA/n+9jvO42Ipib53athrfVG8gRt8fzPL66C6ZqHq+6zZophhrCdfJh/0G4x9xJh5gdMprlaCR1P8yAaVvhBQSKGc4SiIkyMNBcHJ5YTtMQMTfxaB4G1sHZ6SDAY9a6Cq/zNjDwfPapWLsiP4mRhE5SSjJX6l6EYbkm0JeLQg+AbJiNEPvrvDp1wtTxzlPJtIivthmLMThFxK7+DkrYFuLvN5AHUdo9KTDLvHtDCvV70r8v0gafsrKkM/OE9Jtzoo0e1N/5K/ZdyFRbAkFT4QSF3nwpbmBWLf2Evg//YyEuxnz4CwPqFST2mucnrCCGCVWp1vnHZ0y30nM35njLOmWdRDFy5l27pKUTwLp02y3UYiiZyP7d3/u5pKiN4vC27VuvzprSdJxWoAvluOiDeRh+/oeQDowxoT/Oop8DzB9uJmjktXw8jyMW2+Rpg+ENQqeNgF1OGlEzypaWiRskEFlkpLb4v/s3ZDYkL1oW0Nv/J8LTjTOTEaYt2Udjoe9x2xWiGnQixhdChWuG+MaoWffzUgx1tsVj/DBXijR5DjkPkrA1GA98zd3q8GKEaAdcDenJjHhNYSd4+rE9pIsnYn7fo5X/tFfcQH1XQ== nobody@google.com",
            },
            CpuCoreCount = 4,
            GiVersion = "19.0.0.0",
            TimeZone = new Gcp.OracleDatabase.Inputs.CloudVmClusterPropertiesTimeZoneArgs
            {
                Id = "UTC",
            },
            NodeCount = 2,
            OcpuCount = 4,
            DataStorageSizeTb = 2,
            DbNodeStorageSizeGb = 120,
            DbServerOcids = new[]
            {
                mydbserver.Apply(getDbServersResult => getDbServersResult.DbServers[0]?.Properties[0]?.Ocid),
                mydbserver.Apply(getDbServersResult => getDbServersResult.DbServers[1]?.Properties[0]?.Ocid),
            },
            DiskRedundancy = "HIGH",
            SparseDiskgroupEnabled = false,
            LocalBackupEnabled = false,
            ClusterName = "pq-ppat4",
            HostnamePrefix = "hostname1",
            DiagnosticsDataCollectionOptions = new Gcp.OracleDatabase.Inputs.CloudVmClusterPropertiesDiagnosticsDataCollectionOptionsArgs
            {
                DiagnosticsEventsEnabled = true,
                HealthMonitoringEnabled = true,
                IncidentLogsEnabled = true,
            },
            MemorySizeGb = 60,
        },
        DeletionProtection = true,
    });

});
package generated_program;

import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.oracledatabase.CloudExadataInfrastructure;
import com.pulumi.gcp.oracledatabase.CloudExadataInfrastructureArgs;
import com.pulumi.gcp.oracledatabase.inputs.CloudExadataInfrastructurePropertiesArgs;
import com.pulumi.gcp.compute.ComputeFunctions;
import com.pulumi.gcp.compute.inputs.GetNetworkArgs;
import com.pulumi.gcp.oracledatabase.OracledatabaseFunctions;
import com.pulumi.gcp.oracledatabase.inputs.GetDbServersArgs;
import com.pulumi.gcp.oracledatabase.CloudVmCluster;
import com.pulumi.gcp.oracledatabase.CloudVmClusterArgs;
import com.pulumi.gcp.oracledatabase.inputs.CloudVmClusterPropertiesArgs;
import com.pulumi.gcp.oracledatabase.inputs.CloudVmClusterPropertiesTimeZoneArgs;
import com.pulumi.gcp.oracledatabase.inputs.CloudVmClusterPropertiesDiagnosticsDataCollectionOptionsArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;

public class App {
    public static void main(String[] args) {
        Pulumi.run(App::stack);
    }

    public static void stack(Context ctx) {
        var cloudExadataInfrastructures = new CloudExadataInfrastructure("cloudExadataInfrastructures", CloudExadataInfrastructureArgs.builder()
            .cloudExadataInfrastructureId("my-exadata")
            .displayName("my-exadata displayname")
            .location("us-east4")
            .project("my-project")
            .properties(CloudExadataInfrastructurePropertiesArgs.builder()
                .shape("Exadata.X9M")
                .computeCount(2)
                .storageCount(3)
                .build())
            .deletionProtection(true)
            .build());

        final var default = ComputeFunctions.getNetwork(GetNetworkArgs.builder()
            .name("new")
            .project("my-project")
            .build());

        final var mydbserver = OracledatabaseFunctions.getDbServers(GetDbServersArgs.builder()
            .location("us-east4")
            .project("my-project")
            .cloudExadataInfrastructure(cloudExadataInfrastructures.cloudExadataInfrastructureId())
            .build());

        var myVmcluster = new CloudVmCluster("myVmcluster", CloudVmClusterArgs.builder()
            .cloudVmClusterId("my-instance")
            .displayName("my-instance displayname")
            .location("us-east4")
            .project("my-project")
            .exadataInfrastructure(cloudExadataInfrastructures.id())
            .network(default_.id())
            .cidr("10.5.0.0/24")
            .backupSubnetCidr("10.6.0.0/24")
            .labels(Map.of("label-one", "value-one"))
            .properties(CloudVmClusterPropertiesArgs.builder()
                .licenseType("LICENSE_INCLUDED")
                .sshPublicKeys("ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCz1X2744t+6vRLmE5u6nHi6/QWh8bQDgHmd+OIxRQIGA/IWUtCs2FnaCNZcqvZkaeyjk5v0lTA/n+9jvO42Ipib53athrfVG8gRt8fzPL66C6ZqHq+6zZophhrCdfJh/0G4x9xJh5gdMprlaCR1P8yAaVvhBQSKGc4SiIkyMNBcHJ5YTtMQMTfxaB4G1sHZ6SDAY9a6Cq/zNjDwfPapWLsiP4mRhE5SSjJX6l6EYbkm0JeLQg+AbJiNEPvrvDp1wtTxzlPJtIivthmLMThFxK7+DkrYFuLvN5AHUdo9KTDLvHtDCvV70r8v0gafsrKkM/OE9Jtzoo0e1N/5K/ZdyFRbAkFT4QSF3nwpbmBWLf2Evg//YyEuxnz4CwPqFST2mucnrCCGCVWp1vnHZ0y30nM35njLOmWdRDFy5l27pKUTwLp02y3UYiiZyP7d3/u5pKiN4vC27VuvzprSdJxWoAvluOiDeRh+/oeQDowxoT/Oop8DzB9uJmjktXw8jyMW2+Rpg+ENQqeNgF1OGlEzypaWiRskEFlkpLb4v/s3ZDYkL1oW0Nv/J8LTjTOTEaYt2Udjoe9x2xWiGnQixhdChWuG+MaoWffzUgx1tsVj/DBXijR5DjkPkrA1GA98zd3q8GKEaAdcDenJjHhNYSd4+rE9pIsnYn7fo5X/tFfcQH1XQ== nobody@google.com")
                .cpuCoreCount(4)
                .giVersion("19.0.0.0")
                .timeZone(CloudVmClusterPropertiesTimeZoneArgs.builder()
                    .id("UTC")
                    .build())
                .nodeCount(2)
                .ocpuCount(4.0)
                .dataStorageSizeTb(2.0)
                .dbNodeStorageSizeGb(120)
                .dbServerOcids(                
                    mydbserver.applyValue(_mydbserver -> _mydbserver.dbServers()[0].properties()[0].ocid()),
                    mydbserver.applyValue(_mydbserver -> _mydbserver.dbServers()[1].properties()[0].ocid()))
                .diskRedundancy("HIGH")
                .sparseDiskgroupEnabled(false)
                .localBackupEnabled(false)
                .clusterName("pq-ppat4")
                .hostnamePrefix("hostname1")
                .diagnosticsDataCollectionOptions(CloudVmClusterPropertiesDiagnosticsDataCollectionOptionsArgs.builder()
                    .diagnosticsEventsEnabled(true)
                    .healthMonitoringEnabled(true)
                    .incidentLogsEnabled(true)
                    .build())
                .memorySizeGb(60)
                .build())
            .deletionProtection(true)
            .build());

    }
}
resources:
  myVmcluster:
    type: gcp:oracledatabase:CloudVmCluster
    name: my_vmcluster
    properties:
      cloudVmClusterId: my-instance
      displayName: my-instance displayname
      location: us-east4
      project: my-project
      exadataInfrastructure: ${cloudExadataInfrastructures.id}
      network: ${default.id}
      cidr: 10.5.0.0/24
      backupSubnetCidr: 10.6.0.0/24
      labels:
        label-one: value-one
      properties:
        licenseType: LICENSE_INCLUDED
        sshPublicKeys:
          - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCz1X2744t+6vRLmE5u6nHi6/QWh8bQDgHmd+OIxRQIGA/IWUtCs2FnaCNZcqvZkaeyjk5v0lTA/n+9jvO42Ipib53athrfVG8gRt8fzPL66C6ZqHq+6zZophhrCdfJh/0G4x9xJh5gdMprlaCR1P8yAaVvhBQSKGc4SiIkyMNBcHJ5YTtMQMTfxaB4G1sHZ6SDAY9a6Cq/zNjDwfPapWLsiP4mRhE5SSjJX6l6EYbkm0JeLQg+AbJiNEPvrvDp1wtTxzlPJtIivthmLMThFxK7+DkrYFuLvN5AHUdo9KTDLvHtDCvV70r8v0gafsrKkM/OE9Jtzoo0e1N/5K/ZdyFRbAkFT4QSF3nwpbmBWLf2Evg//YyEuxnz4CwPqFST2mucnrCCGCVWp1vnHZ0y30nM35njLOmWdRDFy5l27pKUTwLp02y3UYiiZyP7d3/u5pKiN4vC27VuvzprSdJxWoAvluOiDeRh+/oeQDowxoT/Oop8DzB9uJmjktXw8jyMW2+Rpg+ENQqeNgF1OGlEzypaWiRskEFlkpLb4v/s3ZDYkL1oW0Nv/J8LTjTOTEaYt2Udjoe9x2xWiGnQixhdChWuG+MaoWffzUgx1tsVj/DBXijR5DjkPkrA1GA98zd3q8GKEaAdcDenJjHhNYSd4+rE9pIsnYn7fo5X/tFfcQH1XQ== nobody@google.com
        cpuCoreCount: '4'
        giVersion: 19.0.0.0
        timeZone:
          id: UTC
        nodeCount: '2'
        ocpuCount: '4.0'
        dataStorageSizeTb: 2
        dbNodeStorageSizeGb: 120
        dbServerOcids:
          - ${mydbserver.dbServers[0].properties[0].ocid}
          - ${mydbserver.dbServers[1].properties[0].ocid}
        diskRedundancy: HIGH
        sparseDiskgroupEnabled: false
        localBackupEnabled: false
        clusterName: pq-ppat4
        hostnamePrefix: hostname1
        diagnosticsDataCollectionOptions:
          diagnosticsEventsEnabled: true
          healthMonitoringEnabled: true
          incidentLogsEnabled: true
        memorySizeGb: 60
      deletionProtection: 'true'
  cloudExadataInfrastructures:
    type: gcp:oracledatabase:CloudExadataInfrastructure
    properties:
      cloudExadataInfrastructureId: my-exadata
      displayName: my-exadata displayname
      location: us-east4
      project: my-project
      properties:
        shape: Exadata.X9M
        computeCount: '2'
        storageCount: '3'
      deletionProtection: 'true'
variables:
  default:
    fn::invoke:
      function: gcp:compute:getNetwork
      arguments:
        name: new
        project: my-project
  mydbserver:
    fn::invoke:
      function: gcp:oracledatabase:getDbServers
      arguments:
        location: us-east4
        project: my-project
        cloudExadataInfrastructure: ${cloudExadataInfrastructures.cloudExadataInfrastructureId}

The nodeCount and ocpuCount properties control cluster size and CPU allocation. Storage is configured via dataStorageSizeTb and dbNodeStorageSizeGb. The dbServerOcids property pins the cluster to specific DB servers within the Exadata infrastructure, retrieved via getDbServersOutput. The diagnosticsDataCollectionOptions block enables health monitoring, event logging, and incident tracking.

Beyond these examples

These snippets focus on specific VM cluster features: VPC and OdbNetwork connectivity options, compute and storage sizing, and diagnostic collection and monitoring. They’re intentionally minimal rather than full database deployments.

The examples reference pre-existing infrastructure such as CloudExadataInfrastructure resources, VPC networks or OdbNetwork/OdbSubnet resources, and DB servers within Exadata infrastructure. They focus on configuring the VM cluster rather than provisioning the underlying Exadata platform.

To keep things focused, common cluster patterns are omitted, including:

  • Time zone configuration (timeZone)
  • Sparse diskgroup and local backup settings
  • Memory tuning (memorySizeGb)
  • Cluster naming conventions (clusterName)

These omissions are intentional: the goal is to illustrate how each VM cluster feature is wired, not provide drop-in Oracle Database modules. See the CloudVmCluster resource reference for all available configuration options.

Let's deploy GCP Oracle Database Cloud VM Clusters

Get started with Pulumi Cloud, then follow our quick setup guide to deploy this infrastructure.

Try Pulumi Cloud for FREE

Frequently Asked Questions

Resource Configuration & Constraints
What properties can't I change after creating the VM cluster?
Nearly all properties are immutable, including cloudVmClusterId, exadataInfrastructure, location, network, cidr, backupSubnetCidr, odbNetwork, odbSubnet, backupOdbSubnet, displayName, and the entire properties block. Plan your configuration carefully, as changes require resource replacement.
What are the naming constraints for cloudVmClusterId?
The ID must match the pattern ^[a-z]([a-z0-9-]{0,61}[a-z0-9])?$, be a maximum of 63 characters, start with a letter, and end with a letter or number.
How do I prevent accidental deletion of my VM cluster?
Set deletionProtection to true. When enabled, Pulumi will refuse to destroy the cluster unless you first set this field to false in your configuration.
Networking Setup
What are the two ways to configure networking for my VM cluster?

You have two approaches:

  1. VPC-based - Use network, cidr, and backupSubnetCidr
  2. ODB-based - Use odbNetwork, odbSubnet, and backupOdbSubnet
Why must odbNetwork match the parent of my odbSubnet and backupOdbSubnet?
If you specify odbNetwork, it must match the parent ODBNetwork of both odbSubnet and backupOdbSubnet. This ensures all networking components belong to the same parent network.
Dependencies & Relationships
What's the relationship between the VM cluster and Exadata Infrastructure?
The VM cluster is created on an existing Exadata Infrastructure resource, specified via the required exadataInfrastructure property. This parent infrastructure must exist before creating the cluster.
How do I specify which DB servers to use for my cluster?
Set properties.dbServerOcids with a list of DB server OCIDs. You can fetch available servers using gcp.oracledatabase.getDbServersOutput and reference their OCIDs.
Labels & Metadata
What does it mean that the labels field is non-authoritative?
The labels field only manages labels present in your Pulumi configuration. It won’t remove labels set by other clients or services. Use the effectiveLabels output to see all labels on the resource.

Using a different cloud?

Explore database guides for other cloud providers: