@@ -2,16 +2,22 @@ use crate::cli::collections::{get_bucket_or_active, Manifest};
2
2
use crate :: cli:: error:: {
3
3
client_error_to_shell_error, deserialize_error, unexpected_status_code_error,
4
4
} ;
5
- use crate :: cli:: util:: { cluster_identifiers_from, get_active_cluster, NuValueMap } ;
5
+ use crate :: cli:: util:: {
6
+ cluster_from_conn_str, cluster_identifiers_from, find_org_id, find_project_id,
7
+ get_active_cluster, NuValueMap ,
8
+ } ;
6
9
use crate :: client:: ManagementRequest ;
7
- use crate :: state:: State ;
10
+ use crate :: remote_cluster:: RemoteCluster ;
11
+ use crate :: remote_cluster:: RemoteClusterType :: Provisioned ;
12
+ use crate :: state:: { RemoteCapellaOrganization , State } ;
8
13
use log:: debug;
9
14
use nu_protocol:: ast:: Call ;
10
15
use nu_protocol:: engine:: { Command , EngineState , Stack } ;
11
16
use nu_protocol:: {
12
- Category , IntoPipelineData , PipelineData , ShellError , Signature , SyntaxShape , Value ,
17
+ Category , IntoPipelineData , PipelineData , ShellError , Signature , Span , SyntaxShape , Value ,
13
18
} ;
14
19
use std:: ops:: Add ;
20
+ use std:: sync:: atomic:: AtomicBool ;
15
21
use std:: sync:: { Arc , Mutex } ;
16
22
use tokio:: time:: Instant ;
17
23
@@ -85,31 +91,23 @@ fn run(
85
91
86
92
debug ! ( "Running scopes get for bucket {:?}" , & bucket) ;
87
93
88
- let response = active_cluster
89
- . cluster ( )
90
- . http_client ( )
91
- . management_request (
92
- ManagementRequest :: GetScopes { bucket } ,
93
- Instant :: now ( ) . add ( active_cluster. timeouts ( ) . management_timeout ( ) ) ,
94
+ let scopes = if active_cluster. cluster_type ( ) == Provisioned {
95
+ get_capella_scopes (
96
+ guard. named_or_active_org ( active_cluster. capella_org ( ) ) ?,
97
+ guard. named_or_active_project ( active_cluster. project ( ) ) ?,
98
+ active_cluster,
99
+ identifier. clone ( ) ,
100
+ bucket,
94
101
ctrl_c. clone ( ) ,
102
+ span,
95
103
)
96
- . map_err ( |e| client_error_to_shell_error ( e, span) ) ?;
97
-
98
- let manifest: Manifest = match response. status ( ) {
99
- 200 => serde_json:: from_str ( response. content ( ) )
100
- . map_err ( |e| deserialize_error ( e. to_string ( ) , span) ) ?,
101
- _ => {
102
- return Err ( unexpected_status_code_error (
103
- response. status ( ) ,
104
- response. content ( ) ,
105
- span,
106
- ) ) ;
107
- }
108
- } ;
109
-
110
- for scope in manifest. scopes {
104
+ } else {
105
+ get_server_scopes ( active_cluster, bucket, ctrl_c. clone ( ) , span)
106
+ } ?;
107
+
108
+ for scope in scopes {
111
109
let mut collected = NuValueMap :: default ( ) ;
112
- collected. add_string ( "scope" , scope. name , span) ;
110
+ collected. add_string ( "scope" , scope, span) ;
113
111
collected. add_string ( "cluster" , identifier. clone ( ) , span) ;
114
112
results. push ( collected. into_value ( span) ) ;
115
113
}
@@ -121,3 +119,81 @@ fn run(
121
119
}
122
120
. into_pipeline_data ( ) )
123
121
}
122
+
123
+ fn get_capella_scopes (
124
+ org : & RemoteCapellaOrganization ,
125
+ project : String ,
126
+ cluster : & RemoteCluster ,
127
+ identifier : String ,
128
+ bucket : String ,
129
+ ctrl_c : Arc < AtomicBool > ,
130
+ span : Span ,
131
+ ) -> Result < Vec < String > , ShellError > {
132
+ let client = org. client ( ) ;
133
+ let deadline = Instant :: now ( ) . add ( org. timeout ( ) ) ;
134
+
135
+ let org_id = find_org_id ( ctrl_c. clone ( ) , & client, deadline, span) ?;
136
+ let project_id = find_project_id (
137
+ ctrl_c. clone ( ) ,
138
+ project,
139
+ & client,
140
+ deadline,
141
+ span,
142
+ org_id. clone ( ) ,
143
+ ) ?;
144
+
145
+ let json_cluster = cluster_from_conn_str (
146
+ identifier. clone ( ) ,
147
+ ctrl_c. clone ( ) ,
148
+ cluster. hostnames ( ) . clone ( ) ,
149
+ & client,
150
+ deadline,
151
+ span,
152
+ org_id. clone ( ) ,
153
+ project_id. clone ( ) ,
154
+ ) ?;
155
+
156
+ let scopes = client
157
+ . list_scopes (
158
+ org_id,
159
+ project_id,
160
+ json_cluster. id ( ) ,
161
+ bucket,
162
+ deadline,
163
+ ctrl_c,
164
+ )
165
+ . map_err ( |e| client_error_to_shell_error ( e, span) ) ?;
166
+
167
+ Ok ( scopes. scopes ( ) . iter ( ) . map ( |s| s. name ( ) . clone ( ) ) . collect ( ) )
168
+ }
169
+
170
+ fn get_server_scopes (
171
+ cluster : & RemoteCluster ,
172
+ bucket : String ,
173
+ ctrl_c : Arc < AtomicBool > ,
174
+ span : Span ,
175
+ ) -> Result < Vec < String > , ShellError > {
176
+ let response = cluster
177
+ . cluster ( )
178
+ . http_client ( )
179
+ . management_request (
180
+ ManagementRequest :: GetScopes { bucket } ,
181
+ Instant :: now ( ) . add ( cluster. timeouts ( ) . management_timeout ( ) ) ,
182
+ ctrl_c. clone ( ) ,
183
+ )
184
+ . map_err ( |e| client_error_to_shell_error ( e, span) ) ?;
185
+
186
+ let manifest: Manifest = match response. status ( ) {
187
+ 200 => serde_json:: from_str ( response. content ( ) )
188
+ . map_err ( |e| deserialize_error ( e. to_string ( ) , span) ) ?,
189
+ _ => {
190
+ return Err ( unexpected_status_code_error (
191
+ response. status ( ) ,
192
+ response. content ( ) ,
193
+ span,
194
+ ) ) ;
195
+ }
196
+ } ;
197
+
198
+ Ok ( manifest. scopes . iter ( ) . map ( |s| s. name . clone ( ) ) . collect ( ) )
199
+ }
0 commit comments