@@ -4,14 +4,14 @@ import * as types from '../types';
44
55import { RandomPassword , RandomPasswordArgs } from '../common/RandomPassword' ;
66import { RandomString , RandomStringArgs } from '../common/RandomString' ;
7- import { VaultSecretResult , VaultSecrets } from '../vault/VaultSecrets' ;
7+ import { VaultSecrets } from '../vault/VaultSecrets' ;
88
99import { BaseComponent } from './BaseComponent' ;
1010import { EncryptionKey } from '../vault/EncryptionKey' ;
11- import { ResourceLocker } from '../common/ResourceLocker' ;
1211import { RoleAssignment } from '../azAd/RoleAssignment' ;
1312import { SecretItemArgs } from '../vault/VaultSecret' ;
1413import { getComponentResourceType } from './helpers' ;
14+ import * as authorization from '@pulumi/azure-native/authorization' ;
1515
1616/**
1717 * Base interface for resource component arguments that combines vault information
@@ -48,7 +48,7 @@ export interface CommonBaseArgs
4848 * @template TArgs - Type parameter extending BaseArgs to define required component arguments
4949 */
5050export abstract class BaseResourceComponent < TArgs extends BaseArgs > extends BaseComponent < TArgs > {
51- public vaultSecrets ?: { [ key : string ] : VaultSecretResult } ;
51+ public vaultSecrets ?: pulumi . Output < string > [ ] ;
5252 private _secrets : { [ key : string ] : pulumi . Input < string > } = { } ;
5353 private _vaultSecretsCreated : boolean = false ;
5454
@@ -220,22 +220,27 @@ export abstract class BaseResourceComponent<TArgs extends BaseArgs> extends Base
220220 return new RandomString ( props . name ?? this . name , props , { parent : this } ) ;
221221 }
222222
223- protected lockFromDeleting ( resource : pulumi . CustomResource ) {
224- return new ResourceLocker (
225- `${ this . name } -lock` ,
226- {
227- resource,
228- level : 'CanNotDelete' ,
229- } ,
230- { dependsOn : resource , parent : this } ,
231- ) ;
223+ private lockFromDeleting ( ) {
224+ const { protect } = this . opts ?? { protect : false } ;
225+ if ( ! protect ) return undefined ;
226+
227+ pulumi . output ( this . getOutputs ( ) ) . apply ( ( o ) => {
228+ const id = o ?. id ;
229+ if ( ! id ) return undefined ;
230+
231+ new authorization . ManagementLockByScope (
232+ `${ this . name } -lock` ,
233+ {
234+ level : 'CanNotDelete' ,
235+ scope : id ,
236+ notes : `Lock ${ this . name } from DELETE` ,
237+ } ,
238+ { dependsOn : this , parent : this , retainOnDelete : true } ,
239+ ) ;
240+ } ) ;
232241 }
233242
234- /**
235- * Internal method to handle post-creation secret management
236- * Creates vault secrets if any secrets were added during component creation
237- */
238- private postCreated ( ) {
243+ private createVaultSecrets ( ) {
239244 const { vaultInfo } = this . args ;
240245 if ( this . _vaultSecretsCreated || Object . keys ( this . _secrets ) . length <= 0 || ! vaultInfo ) return ;
241246
@@ -259,6 +264,15 @@ export abstract class BaseResourceComponent<TArgs extends BaseArgs> extends Base
259264 { dependsOn : this . opts ?. dependsOn , parent : this } ,
260265 ) ;
261266
262- this . vaultSecrets = rs . results ;
267+ this . vaultSecrets = Object . keys ( rs . results ) . map ( ( k ) => pulumi . output ( k ) ) ;
268+ }
269+
270+ /**
271+ * Internal method to handle post-creation secret management
272+ * Creates vault secrets if any secrets were added during component creation
273+ */
274+ private postCreated ( ) {
275+ this . createVaultSecrets ( ) ;
276+ this . lockFromDeleting ( ) ;
263277 }
264278}
0 commit comments