AI instance count - DevWithNehaCloud/Oracle-Cloud-Infrastructure-wiki GitHub Wiki

python script

import oci
import csv

# OCI authentication
config = oci.config.from_file()

identity = oci.identity.IdentityClient(config)
compute = oci.core.ComputeClient(config)
virtual_network = oci.core.VirtualNetworkClient(config)

tenancy_id = config["tenancy"]

# Get all compartments
compartments = [
    tenancy_id
]

compartment_response = oci.pagination.list_call_get_all_results(
    identity.list_compartments,
    tenancy_id,
    compartment_id_in_subtree=True,
    access_level="ANY"
)

for compartment in compartment_response.data:
    if compartment.lifecycle_state == "ACTIVE":
        compartments.append(compartment.id)

print(f"Total compartments scanned: {len(compartments)}")

# CSV file
csv_file = "oci_compute_inventory.csv"

rows = []

total_instances = 0
public_instances = 0
private_instances = 0

for compartment_id in compartments:

    # Get compartment name
    if compartment_id == tenancy_id:
        compartment_name = "Tenancy Root"
    else:
        compartment = identity.get_compartment(compartment_id).data
        compartment_name = compartment.name

    # Get all instances
    instances = oci.pagination.list_call_get_all_results(
        compute.list_instances,
        compartment_id
    ).data

    for instance in instances:

        if instance.lifecycle_state != "RUNNING":
            continue

        total_instances += 1

        public_ip = ""
        private_ip = ""

        # Get VNIC attachments for the instance
        vnic_attachments = oci.pagination.list_call_get_all_results(
            compute.list_vnic_attachments,
            compartment_id,
            instance_id=instance.id
        ).data

        for attachment in vnic_attachments:

            vnic = virtual_network.get_vnic(
                attachment.vnic_id
            ).data

            private_ip = vnic.private_ip

            if vnic.public_ip:
                public_ip = vnic.public_ip
                break

        if public_ip:
            access_type = "Public"
            public_instances += 1
        else:
            access_type = "Private"
            private_instances += 1

        rows.append([
            compartment_name,
            instance.display_name,
            instance.lifecycle_state,
            access_type,
            private_ip,
            public_ip
        ])


# Write CSV
with open(csv_file, "w", newline="", encoding="utf-8") as file:

    writer = csv.writer(file)

    writer.writerow([
        "Compartment",
        "Instance Name",
        "Status",
        "Access Type",
        "Private IP",
        "Public IP"
    ])

    writer.writerows(rows)


print("\n===== OCI COMPUTE INVENTORY =====")
print(f"Total Running Instances : {total_instances}")
print(f"Public Instances        : {public_instances}")
print(f"Private Instances       : {private_instances}")
print(f"CSV Report              : {csv_file}")

open code editor in OCI console and create a file inventory.py, paste the above script and save this

Now open in integrated terminal and run the script

python --version
python inventory.py

this script has also generated the csv download it.

If we want to see the stopped instances also then copy this python script

import oci
import csv

# OCI authentication
config = oci.config.from_file()

identity = oci.identity.IdentityClient(config)
compute = oci.core.ComputeClient(config)
virtual_network = oci.core.VirtualNetworkClient(config)

tenancy_id = config["tenancy"]

# --------------------------------------------------
# Get all compartments including root tenancy
# --------------------------------------------------

compartments = [
    {
        "id": tenancy_id,
        "name": "Tenancy Root"
    }
]

compartment_response = oci.pagination.list_call_get_all_results(
    identity.list_compartments,
    tenancy_id,
    compartment_id_in_subtree=True,
    access_level="ANY"
)

for compartment in compartment_response.data:
    if compartment.lifecycle_state == "ACTIVE":
        compartments.append({
            "id": compartment.id,
            "name": compartment.name
        })

print(f"Total compartments scanned: {len(compartments)}")

# --------------------------------------------------
# Counters
# --------------------------------------------------

total_instances = 0
running_instances = 0
stopped_instances = 0
public_instances = 0
private_instances = 0

rows = []

# --------------------------------------------------
# Scan all compartments
# --------------------------------------------------

for compartment in compartments:

    compartment_id = compartment["id"]
    compartment_name = compartment["name"]

    print(f"Scanning compartment: {compartment_name}")

    instances = oci.pagination.list_call_get_all_results(
        compute.list_instances,
        compartment_id
    ).data

    for instance in instances:

        # Do NOT filter only RUNNING instances
        # We want RUNNING + STOPPED + other non-terminated states

        lifecycle_state = instance.lifecycle_state

        # Skip terminated instances
        if lifecycle_state == "TERMINATED":
            continue

        total_instances += 1

        if lifecycle_state == "RUNNING":
            running_instances += 1

        elif lifecycle_state == "STOPPED":
            stopped_instances += 1

        public_ip = ""
        private_ip = ""

        # --------------------------------------------------
        # Find VNIC and check public/private IP
        # --------------------------------------------------

        vnic_attachments = oci.pagination.list_call_get_all_results(
            compute.list_vnic_attachments,
            compartment_id,
            instance_id=instance.id
        ).data

        for attachment in vnic_attachments:

            vnic = virtual_network.get_vnic(
                attachment.vnic_id
            ).data

            private_ip = vnic.private_ip

            if vnic.public_ip:
                public_ip = vnic.public_ip
                break

        # --------------------------------------------------
        # Classify Public / Private
        # --------------------------------------------------

        if public_ip:
            access_type = "Public"
            public_instances += 1
        else:
            access_type = "Private"
            private_instances += 1

        # --------------------------------------------------
        # Add data to CSV
        # --------------------------------------------------

        rows.append([
            compartment_name,
            instance.display_name,
            lifecycle_state,
            access_type,
            private_ip,
            public_ip
        ])


# --------------------------------------------------
# Create CSV
# --------------------------------------------------

csv_file = "oci_compute_inventory.csv"

with open(csv_file, "w", newline="", encoding="utf-8") as file:

    writer = csv.writer(file)

    writer.writerow([
        "Compartment",
        "Instance Name",
        "Status",
        "Access Type",
        "Private IP",
        "Public IP"
    ])

    writer.writerows(rows)


# --------------------------------------------------
# Final Summary
# --------------------------------------------------

print("\n======================================")
print("       OCI COMPUTE INVENTORY")
print("======================================")

print(f"Total Instances  : {total_instances}")
print(f"Running Instances: {running_instances}")
print(f"Stopped Instances: {stopped_instances}")
print(f"Public Instances : {public_instances}")
print(f"Private Instances: {private_instances}")

print("\nCSV Report Generated:")
print(csv_file)

run the script

check the downloaded csv file