Deploy GCP Oracle Database Cloud VM Clusters

The gcp:oracledatabase/cloudVmCluster:CloudVmCluster resource, part of the Pulumi GCP provider, defines an Oracle Database VM cluster on Google Cloud: its Exadata infrastructure placement, network connectivity, and compute/storage capacity. This guide focuses on three capabilities: VPC and Oracle Database Network connectivity, CPU and storage capacity configuration, and diagnostics and node placement.

VM clusters depend on CloudExadataInfrastructure and connect to either VPC networks or Oracle Database Networks. The examples are intentionally small. Combine them with your own Exadata infrastructure, networking, and capacity requirements.

Create a VM cluster with VPC network and CIDR allocation

Most deployments start by connecting a VM cluster to an existing VPC network and allocating IP ranges for cluster and backup traffic.

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 links the cluster to its underlying Exadata hardware. The network property references your VPC, while cidr and backupSubnetCidr allocate IP ranges for cluster nodes and backup operations. Inside properties, cpuCoreCount sets the number of CPU cores, giVersion specifies the Oracle Grid Infrastructure version, and sshPublicKeys enables SSH access to cluster nodes.

Connect to Oracle Database Network for managed networking

Teams using Oracle Database Network for centralized management reference OdbSubnets instead of VPC networks and CIDR blocks.

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. Oracle Database Network manages IP allocation and routing, simplifying multi-cluster deployments. This approach is an alternative to the VPC configuration shown earlier; choose based on whether you need centralized Oracle network management or direct VPC integration.

Configure storage, diagnostics, and node placement

Production deployments often require explicit control over storage capacity, node count, and which database servers host the cluster.

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 compute capacity. Storage is configured via dataStorageSizeTb and dbNodeStorageSizeGb, while diskRedundancy sets the redundancy level (HIGH provides triple mirroring). The dbServerOcids property pins the cluster to specific database servers within your Exadata infrastructure. The diagnosticsDataCollectionOptions block enables health monitoring, event logging, and incident tracking. This configuration extends the basic setup with capacity tuning and operational controls.

Beyond these examples

These snippets focus on specific VM cluster features: VPC and Oracle Database Network connectivity, CPU, storage, and node capacity tuning, and diagnostics and monitoring configuration. They’re intentionally minimal rather than full database deployments.

The examples rely on pre-existing infrastructure such as CloudExadataInfrastructure resources, VPC networks or OdbNetwork/OdbSubnet resources, and database servers for explicit placement. They focus on configuring the VM cluster rather than provisioning the surrounding infrastructure.

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

  • Backup configuration and retention policies
  • High availability and failover settings
  • Performance tuning (memory, OCPU allocation)
  • Security controls (encryption, access policies)

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

Networking & Configuration
What's the difference between using network/cidr and odbNetwork/odbSubnet for networking?

You can configure networking in two ways:

  1. Traditional VPC - Use network, cidr, and backupSubnetCidr (shown in basic example)
  2. ODB networking - Use odbNetwork, odbSubnet, and backupOdbSubnet (shown in odbnetwork example)

Choose one approach based on your infrastructure setup.

Do I need to specify odbNetwork if I'm using odbSubnet?
The odbNetwork field is optional, but if you specify it, it must match the parent ODBNetwork of both odbSubnet and backupOdbSubnet.
What are the required fields to create a CloudVmCluster?
Required fields are cloudVmClusterId, exadataInfrastructure, location, project, odbNetwork, odbSubnet, and backupOdbSubnet. You must also choose a networking approach (either traditional VPC or ODB networking).
Naming & Constraints
What are the naming rules for cloudVmClusterId?
The cloudVmClusterId must match the pattern [\p{Ll}\p{Lo}][\p{Ll}\p{Lo}\p{N}_-]{0,62}, be maximum 63 characters, start with a lowercase letter, and end with a letter or number. Only lowercase letters, numbers, and hyphens are allowed.
Immutability & Updates
What properties can I change after creating the VM cluster?
Most properties are immutable and cannot be changed after creation, including cloudVmClusterId, exadataInfrastructure, location, network, cidr, backupSubnetCidr, odbNetwork, odbSubnet, backupOdbSubnet, displayName, and properties. Only deletionProtection and labels can be modified.
Can I change the networking configuration after cluster creation?
No, all networking fields (network, cidr, backupSubnetCidr, odbNetwork, odbSubnet, backupOdbSubnet) are immutable and cannot be changed after the cluster is created.
Labels & Metadata
Why aren't all my labels showing up in the labels field?
The labels field is non-authoritative and only manages labels present in your configuration. To see all labels on the resource (including those set by other clients and services), use the effectiveLabels output property.
Protection & Safety
How do I prevent accidental deletion of my VM cluster?
Set deletionProtection to true. This boolean flag prevents the cluster from being accidentally deleted.

Using a different cloud?

Explore database guides for other cloud providers: