@@ -24,31 +24,34 @@ class TDescribeSecretsActor: public NActors::TActorBootstrapped<TDescribeSecrets
24
24
const bool isFound = snapshot->GetSecretValue (NMetadata::NSecret::TSecretIdOrValue::BuildAsId (secretId), secretValue);
25
25
if (!isFound) {
26
26
LastResponse = TEvDescribeSecretsResponse::TDescription (Ydb::StatusIds::BAD_REQUEST, { NYql::TIssue (" secret with name '" + secretId.GetSecretId () + " ' not found" ) });
27
+ if (!SubscribedOnSecrets) {
28
+ CompleteAndPassAway (LastResponse);
29
+ }
27
30
return ;
28
31
}
29
32
secretValues.push_back (secretValue);
30
33
}
31
- Promise.SetValue (TEvDescribeSecretsResponse::TDescription (secretValues));
32
34
33
- UnsubscribeFromSecrets ();
34
- PassAway ();
35
+ CompleteAndPassAway (TEvDescribeSecretsResponse::TDescription (secretValues));
35
36
}
36
37
37
38
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);
39
44
40
- UnsubscribeFromSecrets ();
45
+ if (SubscribedOnSecrets) {
46
+ this ->Send (NMetadata::NProvider::MakeServiceId (SelfId ().NodeId ()), new NMetadata::NProvider::TEvUnsubscribeExternal (GetSecretsSnapshotParser ()));
47
+ }
41
48
PassAway ();
42
49
}
43
50
44
51
NMetadata::NFetcher::ISnapshotsFetcher::TPtr GetSecretsSnapshotParser () {
45
52
return std::make_shared<NMetadata::NSecret::TSnapshotsFetcher>();
46
53
}
47
54
48
- void UnsubscribeFromSecrets () {
49
- this ->Send (NMetadata::NProvider::MakeServiceId (SelfId ().NodeId ()), new NMetadata::NProvider::TEvUnsubscribeExternal (GetSecretsSnapshotParser ()));
50
- }
51
-
52
55
public:
53
56
TDescribeSecretsActor (const TString& ownerUserId, const std::vector<TString>& secretIds, NThreading::TPromise<TEvDescribeSecretsResponse::TDescription> promise, TDuration maximalSecretsSnapshotWaitTime)
54
57
: SecretIds(CreateSecretIds(ownerUserId, secretIds))
@@ -64,8 +67,13 @@ class TDescribeSecretsActor: public NActors::TActorBootstrapped<TDescribeSecrets
64
67
return ;
65
68
}
66
69
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
+ }
69
77
Become (&TDescribeSecretsActor::StateFunc);
70
78
}
71
79
@@ -83,6 +91,7 @@ class TDescribeSecretsActor: public NActors::TActorBootstrapped<TDescribeSecrets
83
91
NThreading::TPromise<TEvDescribeSecretsResponse::TDescription> Promise;
84
92
TEvDescribeSecretsResponse::TDescription LastResponse;
85
93
TDuration MaximalSecretsSnapshotWaitTime;
94
+ bool SubscribedOnSecrets = true ;
86
95
};
87
96
88
97
} // anonymous namespace
@@ -91,13 +100,60 @@ IActor* CreateDescribeSecretsActor(const TString& ownerUserId, const std::vector
91
100
return new TDescribeSecretsActor (ownerUserId, secretIds, promise, maximalSecretsSnapshotWaitTime);
92
101
}
93
102
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) {
95
104
auto promise = NThreading::NewPromise<TEvDescribeSecretsResponse::TDescription>();
96
- actorContext. Register (CreateDescribeSecretsActor (ownerUserId, secretIds, promise, maximalSecretsSnapshotWaitTime));
105
+ actorSystem-> Register (CreateDescribeSecretsActor (ownerUserId, secretIds, promise, maximalSecretsSnapshotWaitTime));
97
106
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 ()));
100
109
});
101
110
}
102
111
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::kToken : {
148
+ const TString& tokenSecretId = authDescription.GetToken ().GetTokenSecretName ();
149
+ auto promise = NThreading::NewPromise<TEvDescribeSecretsResponse::TDescription>();
150
+ actorSystem->Register (CreateDescribeSecretsActor (ownerUserId, {tokenSecretId}, promise, maximalSecretsSnapshotWaitTime));
151
+ return promise.GetFuture ();
152
+ }
153
+
154
+ case NKikimrSchemeOp::TAuth::IDENTITY_NOT_SET:
155
+ return NThreading::MakeFuture (TEvDescribeSecretsResponse::TDescription (Ydb::StatusIds::BAD_REQUEST, { NYql::TIssue (" identity case is not specified" ) }));
156
+ }
157
+ }
158
+
103
159
} // namespace NKikimr::NKqp
0 commit comments