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 FREEFrequently Asked Questions
Resource Configuration & Constraints
cloudVmClusterId, exadataInfrastructure, location, network, cidr, backupSubnetCidr, odbNetwork, odbSubnet, backupOdbSubnet, displayName, and the entire properties block. Plan your configuration carefully, as changes require resource replacement.^[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.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
You have two approaches:
- VPC-based - Use
network,cidr, andbackupSubnetCidr - ODB-based - Use
odbNetwork,odbSubnet, andbackupOdbSubnet
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
exadataInfrastructure property. This parent infrastructure must exist before creating the cluster.properties.dbServerOcids with a list of DB server OCIDs. You can fetch available servers using gcp.oracledatabase.getDbServersOutput and reference their OCIDs.Labels & Metadata
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.