.identity.oraclecloud.com`).
+func (o OciLinkAccountOutput) OciDomainUrl() pulumi.StringOutput {
+ return o.ApplyT(func(v *OciLinkAccount) pulumi.StringOutput { return v.OciDomainUrl }).(pulumi.StringOutput)
+}
+
+// Home region of the tenancy (e.g. `us-ashburn-1`).
+func (o OciLinkAccountOutput) OciHomeRegion() pulumi.StringOutput {
+ return o.ApplyT(func(v *OciLinkAccount) pulumi.StringOutput { return v.OciHomeRegion }).(pulumi.StringOutput)
+}
+
+// OCI region for the linkage (ignored on create, applied on update).
+func (o OciLinkAccountOutput) OciRegion() pulumi.StringPtrOutput {
+ return o.ApplyT(func(v *OciLinkAccount) pulumi.StringPtrOutput { return v.OciRegion }).(pulumi.StringPtrOutput)
+}
+
+// Service user name associated with the WIF configuration.
+func (o OciLinkAccountOutput) OciSvcUserName() pulumi.StringOutput {
+ return o.ApplyT(func(v *OciLinkAccount) pulumi.StringOutput { return v.OciSvcUserName }).(pulumi.StringOutput)
+}
+
+// OCI tenancy OCID (root tenancy). Changing forces a new linked account.
+func (o OciLinkAccountOutput) TenantId() pulumi.StringOutput {
+ return o.ApplyT(func(v *OciLinkAccount) pulumi.StringOutput { return v.TenantId }).(pulumi.StringOutput)
+}
+
+// Vault secret OCID containing a user or auxiliary secret.
+func (o OciLinkAccountOutput) UserVaultOcid() pulumi.StringPtrOutput {
+ return o.ApplyT(func(v *OciLinkAccount) pulumi.StringPtrOutput { return v.UserVaultOcid }).(pulumi.StringPtrOutput)
+}
+
+type OciLinkAccountArrayOutput struct{ *pulumi.OutputState }
+
+func (OciLinkAccountArrayOutput) ElementType() reflect.Type {
+ return reflect.TypeOf((*[]*OciLinkAccount)(nil)).Elem()
+}
+
+func (o OciLinkAccountArrayOutput) ToOciLinkAccountArrayOutput() OciLinkAccountArrayOutput {
+ return o
+}
+
+func (o OciLinkAccountArrayOutput) ToOciLinkAccountArrayOutputWithContext(ctx context.Context) OciLinkAccountArrayOutput {
+ return o
+}
+
+func (o OciLinkAccountArrayOutput) Index(i pulumi.IntInput) OciLinkAccountOutput {
+ return pulumi.All(o, i).ApplyT(func(vs []interface{}) *OciLinkAccount {
+ return vs[0].([]*OciLinkAccount)[vs[1].(int)]
+ }).(OciLinkAccountOutput)
+}
+
+type OciLinkAccountMapOutput struct{ *pulumi.OutputState }
+
+func (OciLinkAccountMapOutput) ElementType() reflect.Type {
+ return reflect.TypeOf((*map[string]*OciLinkAccount)(nil)).Elem()
+}
+
+func (o OciLinkAccountMapOutput) ToOciLinkAccountMapOutput() OciLinkAccountMapOutput {
+ return o
+}
+
+func (o OciLinkAccountMapOutput) ToOciLinkAccountMapOutputWithContext(ctx context.Context) OciLinkAccountMapOutput {
+ return o
+}
+
+func (o OciLinkAccountMapOutput) MapIndex(k pulumi.StringInput) OciLinkAccountOutput {
+ return pulumi.All(o, k).ApplyT(func(vs []interface{}) *OciLinkAccount {
+ return vs[0].(map[string]*OciLinkAccount)[vs[1].(string)]
+ }).(OciLinkAccountOutput)
+}
+
+func init() {
+ pulumi.RegisterInputType(reflect.TypeOf((*OciLinkAccountInput)(nil)).Elem(), &OciLinkAccount{})
+ pulumi.RegisterInputType(reflect.TypeOf((*OciLinkAccountArrayInput)(nil)).Elem(), OciLinkAccountArray{})
+ pulumi.RegisterInputType(reflect.TypeOf((*OciLinkAccountMapInput)(nil)).Elem(), OciLinkAccountMap{})
+ pulumi.RegisterOutputType(OciLinkAccountOutput{})
+ pulumi.RegisterOutputType(OciLinkAccountArrayOutput{})
+ pulumi.RegisterOutputType(OciLinkAccountMapOutput{})
+}
diff --git a/sdk/java/src/main/java/com/pulumi/newrelic/cloud/OciLinkAccount.java b/sdk/java/src/main/java/com/pulumi/newrelic/cloud/OciLinkAccount.java
new file mode 100644
index 00000000..31a0b0b4
--- /dev/null
+++ b/sdk/java/src/main/java/com/pulumi/newrelic/cloud/OciLinkAccount.java
@@ -0,0 +1,420 @@
+// *** WARNING: this file was generated by pulumi-language-java. ***
+// *** Do not edit by hand unless you're certain you know what you are doing! ***
+
+package com.pulumi.newrelic.cloud;
+
+import com.pulumi.core.Output;
+import com.pulumi.core.annotations.Export;
+import com.pulumi.core.annotations.ResourceType;
+import com.pulumi.core.internal.Codegen;
+import com.pulumi.newrelic.Utilities;
+import com.pulumi.newrelic.cloud.OciLinkAccountArgs;
+import com.pulumi.newrelic.cloud.inputs.OciLinkAccountState;
+import java.lang.String;
+import java.util.List;
+import java.util.Optional;
+import javax.annotation.Nullable;
+
+/**
+ * Use this resource to link an Oracle Cloud Infrastructure (OCI) account to New Relic.
+ *
+ * This setup is used to create a provider account with OCI credentials, establishing a relationship between Oracle and New Relic. Additionally, as part of this integration, we store WIF (Workload Identity Federation) credentials which are further used for fetching data and validations, and vault OCIDs corresponding to the vault resource where the New Relic ingest and user keys are stored in the OCI console.
+ *
+ * ## Prerequisites
+ *
+ * For the `newrelic.cloud.OciLinkAccount` resource to work properly, you need an OCI tenancy with IAM permissions to create and manage the identity artifacts (client/application, secrets, compartments, and service user) referenced below. OCI provides enterprise-grade cloud services across multiple global regions.
+ *
+ * > NOTE: Before using this resource, ensure the New Relic provider is configured with valid credentials.\
+ * See Getting Started: New Relic provider guide
+ *
+ * If you encounter issues or bugs, please open an issue in the GitHub repository.
+ *
+ * ### Workload Identity Federation (WIF) Attributes
+ *
+ * The following arguments rely on an OCI Identity Domain OAuth2 client set up for workload identity federation (identity propagation): `oci_client_id`, `oci_client_secret`, `oci_domain_url`, and `oci_svc_user_name`.
+ *
+ * To create and retrieve these values, follow Oracle's guidance for configuring identity propagation / JWT token exchange:
+ *
+ * [Oracle documentation: Create an identity propagation trust (JWT token exchange)](https://docs.oracle.com/en-us/iaas/Content/Identity/api-getstarted/json_web_token_exchange.htm#jwt_token_exchange__create-identity-propagation-trust)
+ *
+ * WIF configuration steps:
+ * 1. Create (or identify) an Identity Domain and register an OAuth2 confidential application (client) to represent New Relic ingestion.
+ * 2. Generate / record the client ID (`oci_client_id`) and client secret (`oci_client_secret`). Store the secret securely (e.g., in OCI Vault; reference its OCID via `ingest_vault_ocid` / `user_vault_ocid` if desired).
+ * 3. Use the Identity Domain base URL as `oci_domain_url` (format: `https://idcs-<hash>.identity.oraclecloud.com`).
+ * 4. Provide / map a service user (or principal) used for workload identity federation as `oci_svc_user_name`.
+ * 5. Ensure the client has the required scopes and the tenancy policies allow the token exchange.
+ *
+ * > TIP: Rotating the OAuth2 client secret only requires updating `oci_client_secret`; it does not force resource replacement.
+ *
+ * ## Example Usage
+ *
+ * Minimal example (required arguments for creation):
+ *
+ *
+ * {@code
+ * package generated_program;
+ *
+ * import com.pulumi.Context;
+ * import com.pulumi.Pulumi;
+ * import com.pulumi.core.Output;
+ * import com.pulumi.newrelic.cloud.OciLinkAccount;
+ * import com.pulumi.newrelic.cloud.OciLinkAccountArgs;
+ * 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 example = new OciLinkAccount("example", OciLinkAccountArgs.builder()
+ * .accountId("1234567")
+ * .tenantId("ocid1.tenancy.oc1..aaaaaaaaexample")
+ * .name("my-oci-link")
+ * .compartmentOcid("ocid1.compartment.oc1..bbbbbbbbexample")
+ * .ociClientId("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")
+ * .ociClientSecret(ociClientSecret)
+ * .ociDomainUrl("https://idcs-1234567890abcdef.identity.oraclecloud.com")
+ * .ociHomeRegion("us-ashburn-1")
+ * .ociSvcUserName("svc-newrelic-collector")
+ * .build());
+ *
+ * }
+ * }
+ * }
+ *
+ *
+ * Example including optional secret references and update-only fields:
+ *
+ *
+ * {@code
+ * package generated_program;
+ *
+ * import com.pulumi.Context;
+ * import com.pulumi.Pulumi;
+ * import com.pulumi.core.Output;
+ * import com.pulumi.newrelic.cloud.OciLinkAccount;
+ * import com.pulumi.newrelic.cloud.OciLinkAccountArgs;
+ * 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 full = new OciLinkAccount("full", OciLinkAccountArgs.builder()
+ * .name("my-oci-link-full")
+ * .tenantId("ocid1.tenancy.oc1..aaaaaaaaexample")
+ * .compartmentOcid("ocid1.compartment.oc1..bbbbbbbbexample")
+ * .ociClientId("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")
+ * .ociClientSecret(ociClientSecret)
+ * .ociDomainUrl("https://idcs-1234567890abcdef.identity.oraclecloud.com")
+ * .ociHomeRegion("us-ashburn-1")
+ * .ociSvcUserName("svc-newrelic-collector")
+ * .ingestVaultOcid("ocid1.vaultsecret.oc1..ccccccccexample")
+ * .userVaultOcid("ocid1.vaultsecret.oc1..ddddddddexample")
+ * .instrumentationType("METRICS,LOGS")
+ * .ociRegion("us-phoenix-1")
+ * .metricStackOcid("ocid1.stack.oc1..eeeeeeeeexample")
+ * .loggingStackOcid("ocid1.stack.oc1..ffffffloggingstack")
+ * .build());
+ *
+ * }
+ * }
+ * }
+ *
+ *
+ * ## Import
+ *
+ * Linked OCI accounts can be imported using the `id`, e.g.
+ *
+ * bash
+ *
+ * ```sh
+ * $ pulumi import newrelic:cloud/ociLinkAccount:OciLinkAccount foo <id>
+ * ```
+ *
+ */
+@ResourceType(type="newrelic:cloud/ociLinkAccount:OciLinkAccount")
+public class OciLinkAccount extends com.pulumi.resources.CustomResource {
+ /**
+ * New Relic account to operate on. Overrides the provider-level `account_id`. If omitted, use the provider default or `NEW_RELIC_ACCOUNT_ID`.
+ *
+ */
+ @Export(name="accountId", refs={String.class}, tree="[0]")
+ private Output accountId;
+
+ /**
+ * @return New Relic account to operate on. Overrides the provider-level `account_id`. If omitted, use the provider default or `NEW_RELIC_ACCOUNT_ID`.
+ *
+ */
+ public Output accountId() {
+ return this.accountId;
+ }
+ /**
+ * OCI compartment OCID representing (or containing) the monitored resources/newrelic compartment.
+ *
+ */
+ @Export(name="compartmentOcid", refs={String.class}, tree="[0]")
+ private Output compartmentOcid;
+
+ /**
+ * @return OCI compartment OCID representing (or containing) the monitored resources/newrelic compartment.
+ *
+ */
+ public Output compartmentOcid() {
+ return this.compartmentOcid;
+ }
+ /**
+ * Vault secret OCID containing an ingest secret.
+ *
+ */
+ @Export(name="ingestVaultOcid", refs={String.class}, tree="[0]")
+ private Output* @Nullable */ String> ingestVaultOcid;
+
+ /**
+ * @return Vault secret OCID containing an ingest secret.
+ *
+ */
+ public Output> ingestVaultOcid() {
+ return Codegen.optional(this.ingestVaultOcid);
+ }
+ /**
+ * Specifies the type of integration, such as metrics, logs, or a combination of logs and metrics (e.g., `METRICS`, `LOGS`, `METRICS,LOGS`).
+ *
+ */
+ @Export(name="instrumentationType", refs={String.class}, tree="[0]")
+ private Output* @Nullable */ String> instrumentationType;
+
+ /**
+ * @return Specifies the type of integration, such as metrics, logs, or a combination of logs and metrics (e.g., `METRICS`, `LOGS`, `METRICS,LOGS`).
+ *
+ */
+ public Output> instrumentationType() {
+ return Codegen.optional(this.instrumentationType);
+ }
+ /**
+ * The Logging stack identifier for the OCI account.
+ *
+ */
+ @Export(name="loggingStackOcid", refs={String.class}, tree="[0]")
+ private Output* @Nullable */ String> loggingStackOcid;
+
+ /**
+ * @return The Logging stack identifier for the OCI account.
+ *
+ */
+ public Output> loggingStackOcid() {
+ return Codegen.optional(this.loggingStackOcid);
+ }
+ /**
+ * Metric stack OCID (ignored on create, applied on update).
+ *
+ */
+ @Export(name="metricStackOcid", refs={String.class}, tree="[0]")
+ private Output* @Nullable */ String> metricStackOcid;
+
+ /**
+ * @return Metric stack OCID (ignored on create, applied on update).
+ *
+ */
+ public Output> metricStackOcid() {
+ return Codegen.optional(this.metricStackOcid);
+ }
+ /**
+ * Display name for the linked account.
+ *
+ */
+ @Export(name="name", refs={String.class}, tree="[0]")
+ private Output name;
+
+ /**
+ * @return Display name for the linked account.
+ *
+ */
+ public Output name() {
+ return this.name;
+ }
+ /**
+ * OCI Identity Domain (IDCS) OAuth2 client ID used for workload identity federation.
+ *
+ */
+ @Export(name="ociClientId", refs={String.class}, tree="[0]")
+ private Output ociClientId;
+
+ /**
+ * @return OCI Identity Domain (IDCS) OAuth2 client ID used for workload identity federation.
+ *
+ */
+ public Output ociClientId() {
+ return this.ociClientId;
+ }
+ /**
+ * OAuth2 client secret. Not displayed in plans or state outputs.
+ *
+ */
+ @Export(name="ociClientSecret", refs={String.class}, tree="[0]")
+ private Output ociClientSecret;
+
+ /**
+ * @return OAuth2 client secret. Not displayed in plans or state outputs.
+ *
+ */
+ public Output ociClientSecret() {
+ return this.ociClientSecret;
+ }
+ /**
+ * Base URL of the OCI Identity Domain (e.g. `https://idcs-<hash>.identity.oraclecloud.com`).
+ *
+ */
+ @Export(name="ociDomainUrl", refs={String.class}, tree="[0]")
+ private Output ociDomainUrl;
+
+ /**
+ * @return Base URL of the OCI Identity Domain (e.g. `https://idcs-<hash>.identity.oraclecloud.com`).
+ *
+ */
+ public Output ociDomainUrl() {
+ return this.ociDomainUrl;
+ }
+ /**
+ * Home region of the tenancy (e.g. `us-ashburn-1`).
+ *
+ */
+ @Export(name="ociHomeRegion", refs={String.class}, tree="[0]")
+ private Output ociHomeRegion;
+
+ /**
+ * @return Home region of the tenancy (e.g. `us-ashburn-1`).
+ *
+ */
+ public Output ociHomeRegion() {
+ return this.ociHomeRegion;
+ }
+ /**
+ * OCI region for the linkage (ignored on create, applied on update).
+ *
+ */
+ @Export(name="ociRegion", refs={String.class}, tree="[0]")
+ private Output* @Nullable */ String> ociRegion;
+
+ /**
+ * @return OCI region for the linkage (ignored on create, applied on update).
+ *
+ */
+ public Output> ociRegion() {
+ return Codegen.optional(this.ociRegion);
+ }
+ /**
+ * Service user name associated with the WIF configuration.
+ *
+ */
+ @Export(name="ociSvcUserName", refs={String.class}, tree="[0]")
+ private Output ociSvcUserName;
+
+ /**
+ * @return Service user name associated with the WIF configuration.
+ *
+ */
+ public Output ociSvcUserName() {
+ return this.ociSvcUserName;
+ }
+ /**
+ * OCI tenancy OCID (root tenancy). Changing forces a new linked account.
+ *
+ */
+ @Export(name="tenantId", refs={String.class}, tree="[0]")
+ private Output tenantId;
+
+ /**
+ * @return OCI tenancy OCID (root tenancy). Changing forces a new linked account.
+ *
+ */
+ public Output tenantId() {
+ return this.tenantId;
+ }
+ /**
+ * Vault secret OCID containing a user or auxiliary secret.
+ *
+ */
+ @Export(name="userVaultOcid", refs={String.class}, tree="[0]")
+ private Output* @Nullable */ String> userVaultOcid;
+
+ /**
+ * @return Vault secret OCID containing a user or auxiliary secret.
+ *
+ */
+ public Output> userVaultOcid() {
+ return Codegen.optional(this.userVaultOcid);
+ }
+
+ /**
+ *
+ * @param name The _unique_ name of the resulting resource.
+ */
+ public OciLinkAccount(java.lang.String name) {
+ this(name, OciLinkAccountArgs.Empty);
+ }
+ /**
+ *
+ * @param name The _unique_ name of the resulting resource.
+ * @param args The arguments to use to populate this resource's properties.
+ */
+ public OciLinkAccount(java.lang.String name, OciLinkAccountArgs args) {
+ this(name, args, null);
+ }
+ /**
+ *
+ * @param name The _unique_ name of the resulting resource.
+ * @param args The arguments to use to populate this resource's properties.
+ * @param options A bag of options that control this resource's behavior.
+ */
+ public OciLinkAccount(java.lang.String name, OciLinkAccountArgs args, @Nullable com.pulumi.resources.CustomResourceOptions options) {
+ super("newrelic:cloud/ociLinkAccount:OciLinkAccount", name, makeArgs(args, options), makeResourceOptions(options, Codegen.empty()), false);
+ }
+
+ private OciLinkAccount(java.lang.String name, Output id, @Nullable OciLinkAccountState state, @Nullable com.pulumi.resources.CustomResourceOptions options) {
+ super("newrelic:cloud/ociLinkAccount:OciLinkAccount", name, state, makeResourceOptions(options, id), false);
+ }
+
+ private static OciLinkAccountArgs makeArgs(OciLinkAccountArgs args, @Nullable com.pulumi.resources.CustomResourceOptions options) {
+ if (options != null && options.getUrn().isPresent()) {
+ return null;
+ }
+ return args == null ? OciLinkAccountArgs.Empty : args;
+ }
+
+ private static com.pulumi.resources.CustomResourceOptions makeResourceOptions(@Nullable com.pulumi.resources.CustomResourceOptions options, @Nullable Output id) {
+ var defaultOptions = com.pulumi.resources.CustomResourceOptions.builder()
+ .version(Utilities.getVersion())
+ .additionalSecretOutputs(List.of(
+ "ociClientSecret"
+ ))
+ .build();
+ return com.pulumi.resources.CustomResourceOptions.merge(defaultOptions, options, id);
+ }
+
+ /**
+ * Get an existing Host 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
+ * @param options Optional settings to control the behavior of the CustomResource.
+ */
+ public static OciLinkAccount get(java.lang.String name, Output id, @Nullable OciLinkAccountState state, @Nullable com.pulumi.resources.CustomResourceOptions options) {
+ return new OciLinkAccount(name, id, state, options);
+ }
+}
diff --git a/sdk/java/src/main/java/com/pulumi/newrelic/cloud/OciLinkAccountArgs.java b/sdk/java/src/main/java/com/pulumi/newrelic/cloud/OciLinkAccountArgs.java
new file mode 100644
index 00000000..e5150afa
--- /dev/null
+++ b/sdk/java/src/main/java/com/pulumi/newrelic/cloud/OciLinkAccountArgs.java
@@ -0,0 +1,623 @@
+// *** WARNING: this file was generated by pulumi-language-java. ***
+// *** Do not edit by hand unless you're certain you know what you are doing! ***
+
+package com.pulumi.newrelic.cloud;
+
+import com.pulumi.core.Output;
+import com.pulumi.core.annotations.Import;
+import com.pulumi.exceptions.MissingRequiredPropertyException;
+import java.lang.String;
+import java.util.Objects;
+import java.util.Optional;
+import javax.annotation.Nullable;
+
+
+public final class OciLinkAccountArgs extends com.pulumi.resources.ResourceArgs {
+
+ public static final OciLinkAccountArgs Empty = new OciLinkAccountArgs();
+
+ /**
+ * New Relic account to operate on. Overrides the provider-level `account_id`. If omitted, use the provider default or `NEW_RELIC_ACCOUNT_ID`.
+ *
+ */
+ @Import(name="accountId")
+ private @Nullable Output accountId;
+
+ /**
+ * @return New Relic account to operate on. Overrides the provider-level `account_id`. If omitted, use the provider default or `NEW_RELIC_ACCOUNT_ID`.
+ *
+ */
+ public Optional