"use strict";
// *** WARNING: this file was generated by pulumi-language-nodejs. ***
// *** Do not edit by hand unless you're certain you know what you are doing! ***
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
    o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
    if (mod && mod.__esModule) return mod;
    var result = {};
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    __setModuleDefault(result, mod);
    return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.VolumeGroup = void 0;
const pulumi = __importStar(require("@pulumi/pulumi"));
const utilities = __importStar(require("../utilities"));
/**
 * This resource provides the Volume Group resource in Oracle Cloud Infrastructure Core service.
 * Api doc link for the resource: https://docs.oracle.com/iaas/api/#/en/iaas/latest/VolumeGroup
 *
 * Example terraform configs related to the resource : https://github.com/oracle/terraform-provider-oci/tree/master/examples/
 *
 * Creates a new volume group in the specified compartment.
 * A volume group is a collection of volumes and may be created from a list of volumes, cloning an existing
 * volume group, or by restoring a volume group backup.
 * You may optionally specify a *display name* for the volume group, which is simply a friendly name or
 * description. It does not have to be unique, and you can change it. Avoid entering confidential information.
 *
 * For more information, see [Volume Groups](https://docs.cloud.oracle.com/iaas/Content/Block/Concepts/volumegroups.htm).
 *
 * Note: If the volume group is created from another volume group or from a volume group backup, a copy of the volumes from the source is made in your compartment. However, this is not automatically deleted by Terraform when this volume group is deleted. To track these volumes, you can import them into the terraform statefile and run terraform destroy. Alternatively, you can also use another interface like CLI, SDK, or Console to remove them manually.
 *
 * ## Example Usage
 *
 * ```typescript
 * import * as pulumi from "@pulumi/pulumi";
 * import * as oci from "@pulumi/oci";
 *
 * const testVolumeGroup = new oci.core.VolumeGroup("test_volume_group", {
 *     availabilityDomain: volumeGroupAvailabilityDomain,
 *     compartmentId: compartmentId,
 *     sourceDetails: {
 *         type: "volumeIds",
 *         volumeIds: [volumeGroupSourceId],
 *     },
 *     backupPolicyId: testVolumeBackupPolicies.volumeBackupPolicies[0].id,
 *     clusterPlacementGroupId: testGroup.id,
 *     definedTags: {
 *         "Operations.CostCenter": "42",
 *     },
 *     displayName: volumeGroupDisplayName,
 *     freeformTags: {
 *         Department: "Finance",
 *     },
 *     volumeGroupReplicas: [{
 *         availabilityDomain: volumeGroupVolumeGroupReplicasAvailabilityDomain,
 *         displayName: volumeGroupVolumeGroupReplicasDisplayName,
 *         xrrKmsKeyId: testKey.id,
 *     }],
 *     volumeIds: [volumeGroupSourceId],
 *     xrcKmsKeyId: testKey.id,
 * });
 * ```
 *
 * ## Import
 *
 * VolumeGroups can be imported using the `id`, e.g.
 *
 * ```sh
 * $ pulumi import oci:Core/volumeGroup:VolumeGroup test_volume_group "id"
 * ```
 */
class VolumeGroup extends pulumi.CustomResource {
    /**
     * Get an existing VolumeGroup resource's state with the given name, ID, and optional extra
     * properties used to qualify the lookup.
     *
     * @param name The _unique_ name of the resulting resource.
     * @param id The _unique_ provider ID of the resource to lookup.
     * @param state Any extra arguments used during the lookup.
     * @param opts Optional settings to control the behavior of the CustomResource.
     */
    static get(name, id, state, opts) {
        return new VolumeGroup(name, state, { ...opts, id: id });
    }
    /** @internal */
    static __pulumiType = 'oci:Core/volumeGroup:VolumeGroup';
    /**
     * Returns true if the given object is an instance of VolumeGroup.  This is designed to work even
     * when multiple copies of the Pulumi SDK have been loaded into the same process.
     */
    static isInstance(obj) {
        if (obj === undefined || obj === null) {
            return false;
        }
        return obj['__pulumiType'] === VolumeGroup.__pulumiType;
    }
    constructor(name, argsOrState, opts) {
        let resourceInputs = {};
        opts = opts || {};
        if (opts.id) {
            const state = argsOrState;
            resourceInputs["availabilityDomain"] = state?.availabilityDomain;
            resourceInputs["backupPolicyId"] = state?.backupPolicyId;
            resourceInputs["clusterPlacementGroupId"] = state?.clusterPlacementGroupId;
            resourceInputs["compartmentId"] = state?.compartmentId;
            resourceInputs["definedTags"] = state?.definedTags;
            resourceInputs["displayName"] = state?.displayName;
            resourceInputs["freeformTags"] = state?.freeformTags;
            resourceInputs["isHydrated"] = state?.isHydrated;
            resourceInputs["preserveVolumeReplica"] = state?.preserveVolumeReplica;
            resourceInputs["sizeInGbs"] = state?.sizeInGbs;
            resourceInputs["sizeInMbs"] = state?.sizeInMbs;
            resourceInputs["sourceDetails"] = state?.sourceDetails;
            resourceInputs["state"] = state?.state;
            resourceInputs["timeCreated"] = state?.timeCreated;
            resourceInputs["volumeGroupReplicas"] = state?.volumeGroupReplicas;
            resourceInputs["volumeGroupReplicasDeletion"] = state?.volumeGroupReplicasDeletion;
            resourceInputs["volumeIds"] = state?.volumeIds;
            resourceInputs["xrcKmsKeyId"] = state?.xrcKmsKeyId;
        }
        else {
            const args = argsOrState;
            if (args?.availabilityDomain === undefined && !opts.urn) {
                throw new Error("Missing required property 'availabilityDomain'");
            }
            if (args?.compartmentId === undefined && !opts.urn) {
                throw new Error("Missing required property 'compartmentId'");
            }
            if (args?.sourceDetails === undefined && !opts.urn) {
                throw new Error("Missing required property 'sourceDetails'");
            }
            resourceInputs["availabilityDomain"] = args?.availabilityDomain;
            resourceInputs["backupPolicyId"] = args?.backupPolicyId;
            resourceInputs["clusterPlacementGroupId"] = args?.clusterPlacementGroupId;
            resourceInputs["compartmentId"] = args?.compartmentId;
            resourceInputs["definedTags"] = args?.definedTags;
            resourceInputs["displayName"] = args?.displayName;
            resourceInputs["freeformTags"] = args?.freeformTags;
            resourceInputs["preserveVolumeReplica"] = args?.preserveVolumeReplica;
            resourceInputs["sourceDetails"] = args?.sourceDetails;
            resourceInputs["volumeGroupReplicas"] = args?.volumeGroupReplicas;
            resourceInputs["volumeGroupReplicasDeletion"] = args?.volumeGroupReplicasDeletion;
            resourceInputs["volumeIds"] = args?.volumeIds;
            resourceInputs["xrcKmsKeyId"] = args?.xrcKmsKeyId;
            resourceInputs["isHydrated"] = undefined /*out*/;
            resourceInputs["sizeInGbs"] = undefined /*out*/;
            resourceInputs["sizeInMbs"] = undefined /*out*/;
            resourceInputs["state"] = undefined /*out*/;
            resourceInputs["timeCreated"] = undefined /*out*/;
        }
        opts = pulumi.mergeOptions(utilities.resourceOptsDefaults(), opts);
        super(VolumeGroup.__pulumiType, name, resourceInputs, opts);
    }
}
exports.VolumeGroup = VolumeGroup;
//# sourceMappingURL=volumeGroup.js.map