@@ -24,31 +24,34 @@ class TDescribeSecretsActor: public NActors::TActorBootstrapped<TDescribeSecrets
2424 const bool isFound = snapshot->GetSecretValue (NMetadata::NSecret::TSecretIdOrValue::BuildAsId (secretId), secretValue);
2525 if (!isFound) {
2626 LastResponse = TEvDescribeSecretsResponse::TDescription (Ydb::StatusIds::BAD_REQUEST, { NYql::TIssue (" secret with name '" + secretId.GetSecretId () + " ' not found" ) });
27+ if (!SubscribedOnSecrets) {
28+ CompleteAndPassAway (LastResponse);
29+ }
2730 return ;
2831 }
2932 secretValues.push_back (secretValue);
3033 }
31- Promise.SetValue (TEvDescribeSecretsResponse::TDescription (secretValues));
3234
33- UnsubscribeFromSecrets ();
34- PassAway ();
35+ CompleteAndPassAway (TEvDescribeSecretsResponse::TDescription (secretValues));
3536 }
3637
3738 void Handle (NActors::TEvents::TEvWakeup::TPtr&) {
38- Promise.SetValue (LastResponse);
39+ CompleteAndPassAway (LastResponse);
40+ }
41+
42+ void CompleteAndPassAway (const TEvDescribeSecretsResponse::TDescription& response) {
43+ Promise.SetValue (response);
3944
40- UnsubscribeFromSecrets ();
45+ if (SubscribedOnSecrets) {
46+ this ->Send (NMetadata::NProvider::MakeServiceId (SelfId ().NodeId ()), new NMetadata::NProvider::TEvUnsubscribeExternal (GetSecretsSnapshotParser ()));
47+ }
4148 PassAway ();
4249 }
4350
4451 NMetadata::NFetcher::ISnapshotsFetcher::TPtr GetSecretsSnapshotParser () {
4552 return std::make_shared<NMetadata::NSecret::TSnapshotsFetcher>();
4653 }
4754
48- void UnsubscribeFromSecrets () {
49- this ->Send (NMetadata::NProvider::MakeServiceId (SelfId ().NodeId ()), new NMetadata::NProvider::TEvUnsubscribeExternal (GetSecretsSnapshotParser ()));
50- }
51-
5255public:
5356 TDescribeSecretsActor (const TString& ownerUserId, const std::vector<TString>& secretIds, NThreading::TPromise<TEvDescribeSecretsResponse::TDescription> promise, TDuration maximalSecretsSnapshotWaitTime)
5457 : SecretIds(CreateSecretIds(ownerUserId, secretIds))
@@ -64,8 +67,13 @@ class TDescribeSecretsActor: public NActors::TActorBootstrapped<TDescribeSecrets
6467 return ;
6568 }
6669
67- this ->Send (NMetadata::NProvider::MakeServiceId (SelfId ().NodeId ()), new NMetadata::NProvider::TEvSubscribeExternal (GetSecretsSnapshotParser ()));
68- this ->Schedule (MaximalSecretsSnapshotWaitTime, new NActors::TEvents::TEvWakeup ());
70+ if (MaximalSecretsSnapshotWaitTime) {
71+ this ->Send (NMetadata::NProvider::MakeServiceId (SelfId ().NodeId ()), new NMetadata::NProvider::TEvSubscribeExternal (GetSecretsSnapshotParser ()));
72+ this ->Schedule (MaximalSecretsSnapshotWaitTime, new NActors::TEvents::TEvWakeup ());
73+ } else {
74+ this ->Send (NMetadata::NProvider::MakeServiceId (SelfId ().NodeId ()), new NMetadata::NProvider::TEvAskSnapshot (GetSecretsSnapshotParser ()));
75+ SubscribedOnSecrets = false ;
76+ }
6977 Become (&TDescribeSecretsActor::StateFunc);
7078 }
7179
@@ -83,6 +91,7 @@ class TDescribeSecretsActor: public NActors::TActorBootstrapped<TDescribeSecrets
8391 NThreading::TPromise<TEvDescribeSecretsResponse::TDescription> Promise;
8492 TEvDescribeSecretsResponse::TDescription LastResponse;
8593 TDuration MaximalSecretsSnapshotWaitTime;
94+ bool SubscribedOnSecrets = true ;
8695};
8796
8897} // anonymous namespace
@@ -91,13 +100,53 @@ IActor* CreateDescribeSecretsActor(const TString& ownerUserId, const std::vector
91100 return new TDescribeSecretsActor (ownerUserId, secretIds, promise, maximalSecretsSnapshotWaitTime);
92101}
93102
94- void RegisterDescribeSecretsActor (const NActors::TActorId& replyActorId, const TString& ownerUserId, const std::vector<TString>& secretIds, const TActorContext& actorContext , TDuration maximalSecretsSnapshotWaitTime) {
103+ void RegisterDescribeSecretsActor (const NActors::TActorId& replyActorId, const TString& ownerUserId, const std::vector<TString>& secretIds, NActors::TActorSystem* actorSystem , TDuration maximalSecretsSnapshotWaitTime) {
95104 auto promise = NThreading::NewPromise<TEvDescribeSecretsResponse::TDescription>();
96- actorContext. Register (CreateDescribeSecretsActor (ownerUserId, secretIds, promise, maximalSecretsSnapshotWaitTime));
105+ actorSystem-> Register (CreateDescribeSecretsActor (ownerUserId, secretIds, promise, maximalSecretsSnapshotWaitTime));
97106
98- promise.GetFuture ().Subscribe ([actorContext , replyActorId](const NThreading::TFuture<TEvDescribeSecretsResponse::TDescription>& result){
99- actorContext. Send (replyActorId, new TEvDescribeSecretsResponse (result.GetValue ()));
107+ promise.GetFuture ().Subscribe ([actorSystem , replyActorId](const NThreading::TFuture<TEvDescribeSecretsResponse::TDescription>& result){
108+ actorSystem-> Send (replyActorId, new TEvDescribeSecretsResponse (result.GetValue ()));
100109 });
101110}
102111
112+ NThreading::TFuture<TEvDescribeSecretsResponse::TDescription> DescribeExternalDataSourceSecrets (const NKikimrSchemeOp::TAuth& authDescription, const TString& ownerUserId, TActorSystem* actorSystem, TDuration maximalSecretsSnapshotWaitTime) {
113+ switch (authDescription.identity_case ()) {
114+ case NKikimrSchemeOp::TAuth::kServiceAccount : {
115+ const TString& saSecretId = authDescription.GetServiceAccount ().GetSecretName ();
116+ auto promise = NThreading::NewPromise<TEvDescribeSecretsResponse::TDescription>();
117+ actorSystem->Register (CreateDescribeSecretsActor (ownerUserId, {saSecretId}, promise, maximalSecretsSnapshotWaitTime));
118+ return promise.GetFuture ();
119+ }
120+
121+ case NKikimrSchemeOp::TAuth::kNone :
122+ return NThreading::MakeFuture (TEvDescribeSecretsResponse::TDescription ({}));
123+
124+ case NKikimrSchemeOp::TAuth::kBasic : {
125+ const TString& passwordSecretId = authDescription.GetBasic ().GetPasswordSecretName ();
126+ auto promise = NThreading::NewPromise<TEvDescribeSecretsResponse::TDescription>();
127+ actorSystem->Register (CreateDescribeSecretsActor (ownerUserId, {passwordSecretId}, promise, maximalSecretsSnapshotWaitTime));
128+ return promise.GetFuture ();
129+ }
130+
131+ case NKikimrSchemeOp::TAuth::kMdbBasic : {
132+ const TString& saSecretId = authDescription.GetMdbBasic ().GetServiceAccountSecretName ();
133+ const TString& passwordSecreId = authDescription.GetMdbBasic ().GetPasswordSecretName ();
134+ auto promise = NThreading::NewPromise<TEvDescribeSecretsResponse::TDescription>();
135+ actorSystem->Register (CreateDescribeSecretsActor (ownerUserId, {saSecretId, passwordSecreId}, promise, maximalSecretsSnapshotWaitTime));
136+ return promise.GetFuture ();
137+ }
138+
139+ case NKikimrSchemeOp::TAuth::kAws : {
140+ const TString& awsAccessKeyIdSecretId = authDescription.GetAws ().GetAwsAccessKeyIdSecretName ();
141+ const TString& awsAccessKeyKeySecretId = authDescription.GetAws ().GetAwsSecretAccessKeySecretName ();
142+ auto promise = NThreading::NewPromise<TEvDescribeSecretsResponse::TDescription>();
143+ actorSystem->Register (CreateDescribeSecretsActor (ownerUserId, {awsAccessKeyIdSecretId, awsAccessKeyKeySecretId}, promise, maximalSecretsSnapshotWaitTime));
144+ return promise.GetFuture ();
145+ }
146+
147+ case NKikimrSchemeOp::TAuth::IDENTITY_NOT_SET:
148+ return NThreading::MakeFuture (TEvDescribeSecretsResponse::TDescription (Ydb::StatusIds::BAD_REQUEST, { NYql::TIssue (" identity case is not specified" ) }));
149+ }
150+ }
151+
103152} // namespace NKikimr::NKqp
0 commit comments