strongdm 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +201 -0
- data/README.md +30 -0
- data/doc/Google.html +95 -0
- data/doc/Google/Protobuf.html +95 -0
- data/doc/LICENSE.html +294 -0
- data/doc/Object.html +290 -0
- data/doc/README_md.html +128 -0
- data/doc/SDM.html +143 -0
- data/doc/SDM/AKS.html +347 -0
- data/doc/SDM/AKSBasicAuth.html +279 -0
- data/doc/SDM/AKSServiceAccount.html +262 -0
- data/doc/SDM/AccountAttachment.html +217 -0
- data/doc/SDM/AccountAttachmentCreateOptions.html +182 -0
- data/doc/SDM/AccountAttachmentCreateResponse.html +216 -0
- data/doc/SDM/AccountAttachmentDeleteResponse.html +199 -0
- data/doc/SDM/AccountAttachmentGetResponse.html +215 -0
- data/doc/SDM/AccountAttachments.html +429 -0
- data/doc/SDM/AccountCreateResponse.html +232 -0
- data/doc/SDM/AccountDeleteResponse.html +197 -0
- data/doc/SDM/AccountGetResponse.html +214 -0
- data/doc/SDM/AccountGrant.html +253 -0
- data/doc/SDM/AccountGrantCreateResponse.html +215 -0
- data/doc/SDM/AccountGrantDeleteResponse.html +198 -0
- data/doc/SDM/AccountGrantGetResponse.html +214 -0
- data/doc/SDM/AccountGrants.html +425 -0
- data/doc/SDM/AccountUpdateResponse.html +214 -0
- data/doc/SDM/Accounts.html +492 -0
- data/doc/SDM/AlreadyExistsError.html +161 -0
- data/doc/SDM/AmazonEKS.html +330 -0
- data/doc/SDM/AmazonES.html +296 -0
- data/doc/SDM/Athena.html +296 -0
- data/doc/SDM/AuroraMysql.html +313 -0
- data/doc/SDM/AuroraPostgres.html +330 -0
- data/doc/SDM/AuthenticationError.html +161 -0
- data/doc/SDM/BadRequestError.html +161 -0
- data/doc/SDM/BigQuery.html +296 -0
- data/doc/SDM/Cassandra.html +313 -0
- data/doc/SDM/Client.html +549 -0
- data/doc/SDM/Clustrix.html +313 -0
- data/doc/SDM/Cockroach.html +330 -0
- data/doc/SDM/CreateResponseMetadata.html +156 -0
- data/doc/SDM/DeadlineExceededError.html +161 -0
- data/doc/SDM/DeleteResponseMetadata.html +156 -0
- data/doc/SDM/Druid.html +296 -0
- data/doc/SDM/DynamoDB.html +296 -0
- data/doc/SDM/Elastic.html +313 -0
- data/doc/SDM/ElasticacheRedis.html +296 -0
- data/doc/SDM/Gateway.html +252 -0
- data/doc/SDM/GetResponseMetadata.html +156 -0
- data/doc/SDM/GoogleGKE.html +296 -0
- data/doc/SDM/Greenplum.html +330 -0
- data/doc/SDM/HTTPAuth.html +313 -0
- data/doc/SDM/HTTPBasicAuth.html +330 -0
- data/doc/SDM/HTTPNoAuth.html +296 -0
- data/doc/SDM/InternalError.html +161 -0
- data/doc/SDM/Kubernetes.html +347 -0
- data/doc/SDM/KubernetesBasicAuth.html +279 -0
- data/doc/SDM/KubernetesServiceAccount.html +262 -0
- data/doc/SDM/Maria.html +313 -0
- data/doc/SDM/Memcached.html +262 -0
- data/doc/SDM/Memsql.html +313 -0
- data/doc/SDM/MongoHost.html +330 -0
- data/doc/SDM/MongoLegacyHost.html +347 -0
- data/doc/SDM/MongoLegacyReplicaset.html +364 -0
- data/doc/SDM/MongoReplicaSet.html +364 -0
- data/doc/SDM/Mysql.html +313 -0
- data/doc/SDM/NodeCreateResponse.html +232 -0
- data/doc/SDM/NodeDeleteResponse.html +197 -0
- data/doc/SDM/NodeGetResponse.html +214 -0
- data/doc/SDM/NodeUpdateResponse.html +214 -0
- data/doc/SDM/Nodes.html +493 -0
- data/doc/SDM/NotFoundError.html +161 -0
- data/doc/SDM/Oracle.html +330 -0
- data/doc/SDM/PermissionError.html +161 -0
- data/doc/SDM/Plumbing.html +15821 -0
- data/doc/SDM/Postgres.html +330 -0
- data/doc/SDM/Presto.html +330 -0
- data/doc/SDM/RDP.html +296 -0
- data/doc/SDM/RPCError.html +182 -0
- data/doc/SDM/RateLimitError.html +183 -0
- data/doc/SDM/RateLimitMetadata.html +233 -0
- data/doc/SDM/Redis.html +279 -0
- data/doc/SDM/Redshift.html +330 -0
- data/doc/SDM/Relay.html +216 -0
- data/doc/SDM/ResourceCreateResponse.html +214 -0
- data/doc/SDM/ResourceDeleteResponse.html +197 -0
- data/doc/SDM/ResourceGetResponse.html +214 -0
- data/doc/SDM/ResourceUpdateResponse.html +215 -0
- data/doc/SDM/Resources.html +482 -0
- data/doc/SDM/Role.html +216 -0
- data/doc/SDM/RoleAttachment.html +216 -0
- data/doc/SDM/RoleAttachmentCreateResponse.html +216 -0
- data/doc/SDM/RoleAttachmentDeleteResponse.html +199 -0
- data/doc/SDM/RoleAttachmentGetResponse.html +214 -0
- data/doc/SDM/RoleAttachments.html +427 -0
- data/doc/SDM/RoleCreateResponse.html +215 -0
- data/doc/SDM/RoleDeleteResponse.html +197 -0
- data/doc/SDM/RoleGetResponse.html +214 -0
- data/doc/SDM/RoleGrant.html +214 -0
- data/doc/SDM/RoleGrantCreateResponse.html +215 -0
- data/doc/SDM/RoleGrantDeleteResponse.html +198 -0
- data/doc/SDM/RoleGrantGetResponse.html +214 -0
- data/doc/SDM/RoleGrants.html +427 -0
- data/doc/SDM/RoleUpdateResponse.html +215 -0
- data/doc/SDM/Roles.html +490 -0
- data/doc/SDM/SQLServer.html +347 -0
- data/doc/SDM/SSH.html +296 -0
- data/doc/SDM/Service.html +215 -0
- data/doc/SDM/Snowflake.html +313 -0
- data/doc/SDM/Sybase.html +296 -0
- data/doc/SDM/SybaseIQ.html +296 -0
- data/doc/SDM/Teradata.html +296 -0
- data/doc/SDM/UpdateResponseMetadata.html +156 -0
- data/doc/SDM/User.html +248 -0
- data/doc/V1.html +864 -0
- data/doc/V1/AccountAttachments.html +109 -0
- data/doc/V1/AccountAttachments/Service.html +116 -0
- data/doc/V1/AccountGrants.html +109 -0
- data/doc/V1/AccountGrants/Service.html +117 -0
- data/doc/V1/Accounts.html +109 -0
- data/doc/V1/Accounts/Service.html +122 -0
- data/doc/V1/Nodes.html +109 -0
- data/doc/V1/Nodes/Service.html +124 -0
- data/doc/V1/Resources.html +109 -0
- data/doc/V1/Resources/Service.html +113 -0
- data/doc/V1/RoleAttachments.html +109 -0
- data/doc/V1/RoleAttachments/Service.html +119 -0
- data/doc/V1/RoleGrants.html +109 -0
- data/doc/V1/RoleGrants/Service.html +119 -0
- data/doc/V1/Roles.html +109 -0
- data/doc/V1/Roles/Service.html +120 -0
- data/doc/created.rid +37 -0
- data/doc/css/fonts.css +167 -0
- data/doc/css/rdoc.css +590 -0
- data/doc/examples/Gemfile.html +95 -0
- data/doc/examples/Gemfile_lock.html +112 -0
- data/doc/examples/README_md.html +95 -0
- data/doc/fonts/Lato-Light.ttf +0 -0
- data/doc/fonts/Lato-LightItalic.ttf +0 -0
- data/doc/fonts/Lato-Regular.ttf +0 -0
- data/doc/fonts/Lato-RegularItalic.ttf +0 -0
- data/doc/fonts/SourceCodePro-Bold.ttf +0 -0
- data/doc/fonts/SourceCodePro-Regular.ttf +0 -0
- data/doc/images/add.png +0 -0
- data/doc/images/arrow_up.png +0 -0
- data/doc/images/brick.png +0 -0
- data/doc/images/brick_link.png +0 -0
- data/doc/images/bug.png +0 -0
- data/doc/images/bullet_black.png +0 -0
- data/doc/images/bullet_toggle_minus.png +0 -0
- data/doc/images/bullet_toggle_plus.png +0 -0
- data/doc/images/date.png +0 -0
- data/doc/images/delete.png +0 -0
- data/doc/images/find.png +0 -0
- data/doc/images/loadingAnimation.gif +0 -0
- data/doc/images/macFFBgHack.png +0 -0
- data/doc/images/package.png +0 -0
- data/doc/images/page_green.png +0 -0
- data/doc/images/page_white_text.png +0 -0
- data/doc/images/page_white_width.png +0 -0
- data/doc/images/plugin.png +0 -0
- data/doc/images/ruby.png +0 -0
- data/doc/images/tag_blue.png +0 -0
- data/doc/images/tag_green.png +0 -0
- data/doc/images/transparent.png +0 -0
- data/doc/images/wrench.png +0 -0
- data/doc/images/wrench_orange.png +0 -0
- data/doc/images/zoom.png +0 -0
- data/doc/index.html +353 -0
- data/doc/js/darkfish.js +161 -0
- data/doc/js/jquery.js +4 -0
- data/doc/js/navigation.js +142 -0
- data/doc/js/navigation.js.gz +0 -0
- data/doc/js/search.js +109 -0
- data/doc/js/search_index.js +1 -0
- data/doc/js/search_index.js.gz +0 -0
- data/doc/js/searcher.js +228 -0
- data/doc/js/searcher.js.gz +0 -0
- data/doc/lib/version.html +98 -0
- data/doc/strongdm_gemspec.html +117 -0
- data/doc/table_of_contents.html +3002 -0
- data/examples/Gemfile +3 -0
- data/examples/Gemfile.lock +14 -0
- data/examples/README.md +5 -0
- data/examples/listUsers.rb +21 -0
- data/examples/panicButton.rb +154 -0
- data/lib/errors/errors.rb +85 -0
- data/lib/grpc/account_attachments_pb.rb +84 -0
- data/lib/grpc/account_attachments_services_pb.rb +44 -0
- data/lib/grpc/account_grants_pb.rb +82 -0
- data/lib/grpc/account_grants_services_pb.rb +44 -0
- data/lib/grpc/accounts_pb.rb +107 -0
- data/lib/grpc/accounts_services_pb.rb +49 -0
- data/lib/grpc/drivers_pb.rb +601 -0
- data/lib/grpc/nodes_pb.rb +107 -0
- data/lib/grpc/nodes_services_pb.rb +49 -0
- data/lib/grpc/options_pb.rb +60 -0
- data/lib/grpc/plumbing.rb +4283 -0
- data/lib/grpc/protoc-gen-swagger/options/annotations_pb.rb +15 -0
- data/lib/grpc/resources_pb.rb +85 -0
- data/lib/grpc/resources_services_pb.rb +45 -0
- data/lib/grpc/role_attachments_pb.rb +79 -0
- data/lib/grpc/role_attachments_services_pb.rb +47 -0
- data/lib/grpc/role_grants_pb.rb +79 -0
- data/lib/grpc/role_grants_services_pb.rb +47 -0
- data/lib/grpc/roles_pb.rb +91 -0
- data/lib/grpc/roles_services_pb.rb +50 -0
- data/lib/grpc/spec_pb.rb +95 -0
- data/lib/models/porcelain.rb +4033 -0
- data/lib/strongdm.rb +128 -0
- data/lib/svc.rb +1331 -0
- data/lib/version +3 -0
- data/lib/version.rb +17 -0
- data/strongdm.gemspec +23 -0
- metadata +318 -0
data/lib/strongdm.rb
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# Copyright 2020 StrongDM Inc
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
#
|
|
15
|
+
|
|
16
|
+
# This file was generated by protogen. DO NOT EDIT.
|
|
17
|
+
|
|
18
|
+
require_relative "./svc"
|
|
19
|
+
require "base64"
|
|
20
|
+
require "openssl"
|
|
21
|
+
|
|
22
|
+
DEFAULT_MAX_RETRIES = 3
|
|
23
|
+
DEFAULT_BASE_RETRY_DELAY = 0.0030 # 30 ms
|
|
24
|
+
DEFAULT_MAX_RETRY_DELAY = 300 # 300 seconds
|
|
25
|
+
|
|
26
|
+
module SDM
|
|
27
|
+
|
|
28
|
+
# Client bundles all the services together and initializes them.
|
|
29
|
+
class Client
|
|
30
|
+
# Creates a new strongDM API client.
|
|
31
|
+
def initialize(api_access_key, api_secret_key, host:"api.strongdm.com:443", insecure:false)
|
|
32
|
+
@api_access_key = api_access_key
|
|
33
|
+
@api_secret_key = Base64.strict_decode64(api_secret_key)
|
|
34
|
+
@max_retries = DEFAULT_MAX_RETRIES
|
|
35
|
+
@base_retry_delay = DEFAULT_BASE_RETRY_DELAY
|
|
36
|
+
@max_retry_delay = DEFAULT_MAX_RETRY_DELAY
|
|
37
|
+
@account_attachments = AccountAttachments.new(host, insecure, self)
|
|
38
|
+
@account_grants = AccountGrants.new(host, insecure, self)
|
|
39
|
+
@accounts = Accounts.new(host, insecure, self)
|
|
40
|
+
@nodes = Nodes.new(host, insecure, self)
|
|
41
|
+
@resources = Resources.new(host, insecure, self)
|
|
42
|
+
@role_attachments = RoleAttachments.new(host, insecure, self)
|
|
43
|
+
@role_grants = RoleGrants.new(host, insecure, self)
|
|
44
|
+
@roles = Roles.new(host, insecure, self)
|
|
45
|
+
@_test_options = Hash.new
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def get_metadata(method_name, req)
|
|
49
|
+
return { 'x-sdm-authentication': @api_access_key,'x-sdm-signature': self.sign(method_name, req.to_proto)}
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def sign(method_name, msg_bytes)
|
|
53
|
+
current_utc_date = Time.now.utc
|
|
54
|
+
date = sprintf("%04d-%02d-%02d",current_utc_date.year, current_utc_date.month, current_utc_date.day)
|
|
55
|
+
|
|
56
|
+
signing_key = OpenSSL::HMAC.digest(OpenSSL::Digest::SHA256.new, @api_secret_key, date)
|
|
57
|
+
signing_key = OpenSSL::HMAC.digest(OpenSSL::Digest::SHA256.new, signing_key, 'sdm_api_v1')
|
|
58
|
+
|
|
59
|
+
sha_req = Digest::SHA256.new
|
|
60
|
+
sha_req << method_name
|
|
61
|
+
sha_req << "\n"
|
|
62
|
+
sha_req << msg_bytes
|
|
63
|
+
request_hash = sha_req.digest
|
|
64
|
+
|
|
65
|
+
return Base64.strict_encode64(OpenSSL::HMAC.digest(OpenSSL::Digest::SHA256.new, signing_key, request_hash))
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def jitterSleep(iter)
|
|
69
|
+
dur_max = @base_retry_delay * 2**iter
|
|
70
|
+
if (dur_max > @max_retry_delay)
|
|
71
|
+
dur_max = @max_retry_delay
|
|
72
|
+
end
|
|
73
|
+
dur = rand() * dur_max
|
|
74
|
+
sleep(dur)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def shouldRetry(iter, err)
|
|
78
|
+
if (iter >= @max_retries-1)
|
|
79
|
+
return false
|
|
80
|
+
end
|
|
81
|
+
if not err .is_a? GRPC::BadStatus
|
|
82
|
+
return true
|
|
83
|
+
end
|
|
84
|
+
return err.code() == 13
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
attr_reader :max_retries
|
|
88
|
+
attr_reader :base_retry_delay
|
|
89
|
+
attr_reader :max_retry_delay
|
|
90
|
+
|
|
91
|
+
# API authentication token (read-only).
|
|
92
|
+
attr_reader :api_access_key
|
|
93
|
+
# AccountAttachments assign an account to a role.
|
|
94
|
+
attr_reader :account_attachments
|
|
95
|
+
# AccountGrants connect a resource directly to an account, giving the account the permission to connect to that resource.
|
|
96
|
+
attr_reader :account_grants
|
|
97
|
+
# Accounts are users that have access to strongDM.
|
|
98
|
+
# There are two types of accounts:
|
|
99
|
+
# 1. **Regular users:** humans who are authenticated through username and password or SSO
|
|
100
|
+
# 2. **Service users:** machines that are authneticated using a service token
|
|
101
|
+
attr_reader :accounts
|
|
102
|
+
# Nodes make up the strongDM network, and allow your users to connect securely to your resources.
|
|
103
|
+
# There are two types of nodes:
|
|
104
|
+
# 1. **Relay:** creates connectivity to your datasources, while maintaining the egress-only nature of your firewall
|
|
105
|
+
# 1. **Gateways:** a relay that also listens for connections from strongDM clients
|
|
106
|
+
attr_reader :nodes
|
|
107
|
+
|
|
108
|
+
attr_reader :resources
|
|
109
|
+
# RoleAttachments represent relationships between composite roles and the roles
|
|
110
|
+
# that make up those composite roles. When a composite role is attached to another
|
|
111
|
+
# role, the permissions granted to members of the composite role are augmented to
|
|
112
|
+
# include the permissions granted to members of the attached role.
|
|
113
|
+
attr_reader :role_attachments
|
|
114
|
+
# RoleGrants represent relationships between composite roles and the roles
|
|
115
|
+
# that make up those composite roles. When a composite role is attached to another
|
|
116
|
+
# role, the permissions granted to members of the composite role are augmented to
|
|
117
|
+
# include the permissions granted to members of the attached role.
|
|
118
|
+
attr_reader :role_grants
|
|
119
|
+
# Roles are tools for controlling user access to resources. Each Role holds a
|
|
120
|
+
# list of resources which they grant access to. Composite roles are a special
|
|
121
|
+
# type of Role which have no resource associations of their own, but instead
|
|
122
|
+
# grant access to the combined resources associated with a set of child roles.
|
|
123
|
+
# Each user can be a member of one Role or composite role.
|
|
124
|
+
attr_reader :roles
|
|
125
|
+
attr_reader :_test_options
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
end
|
data/lib/svc.rb
ADDED
|
@@ -0,0 +1,1331 @@
|
|
|
1
|
+
# Copyright 2020 StrongDM Inc
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
#
|
|
15
|
+
|
|
16
|
+
# This file was generated by protogen. DO NOT EDIT.
|
|
17
|
+
|
|
18
|
+
this_dir = File.expand_path(File.dirname(__FILE__))
|
|
19
|
+
lib_dir = File.join(this_dir, 'grpc')
|
|
20
|
+
$LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)
|
|
21
|
+
require 'grpc'
|
|
22
|
+
require 'enumerator'
|
|
23
|
+
Dir[File.join(__dir__, 'grpc', '*.rb')].each {|file| require file }
|
|
24
|
+
Dir[File.join(__dir__, 'models', '*.rb')].each {|file| require file }
|
|
25
|
+
|
|
26
|
+
module SDM
|
|
27
|
+
# AccountAttachments assign an account to a role.
|
|
28
|
+
class AccountAttachments
|
|
29
|
+
def initialize(host, insecure, parent)
|
|
30
|
+
begin
|
|
31
|
+
if insecure
|
|
32
|
+
@stub = V1::AccountAttachments::Stub.new(host, :this_channel_is_insecure)
|
|
33
|
+
else
|
|
34
|
+
cred = GRPC::Core::ChannelCredentials.new()
|
|
35
|
+
@stub = V1::AccountAttachments::Stub.new(host, cred)
|
|
36
|
+
end
|
|
37
|
+
rescue => exception
|
|
38
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
39
|
+
end
|
|
40
|
+
@parent = parent
|
|
41
|
+
end
|
|
42
|
+
# Create registers a new AccountAttachment.
|
|
43
|
+
def create(
|
|
44
|
+
account_attachment \
|
|
45
|
+
,
|
|
46
|
+
options:nil,
|
|
47
|
+
deadline:nil)
|
|
48
|
+
req = V1::AccountAttachmentCreateRequest.new()
|
|
49
|
+
|
|
50
|
+
req.account_attachment = Plumbing::account_attachment_to_plumbing(account_attachment)
|
|
51
|
+
req.options = Plumbing::account_attachment_create_options_to_plumbing(options)
|
|
52
|
+
tries = 0
|
|
53
|
+
plumbing_response = nil
|
|
54
|
+
loop do
|
|
55
|
+
begin
|
|
56
|
+
plumbing_response = @stub.create(req, metadata: @parent.get_metadata('AccountAttachments.Create', req), deadline:deadline)
|
|
57
|
+
rescue => exception
|
|
58
|
+
if (@parent.shouldRetry(tries, exception))
|
|
59
|
+
tries++
|
|
60
|
+
@parent.jitterSleep(tries)
|
|
61
|
+
next
|
|
62
|
+
end
|
|
63
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
64
|
+
end
|
|
65
|
+
break
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
resp = AccountAttachmentCreateResponse.new()
|
|
70
|
+
resp.meta = Plumbing::create_response_metadata_to_porcelain(plumbing_response.meta)
|
|
71
|
+
resp.account_attachment = Plumbing::account_attachment_to_porcelain(plumbing_response.account_attachment)
|
|
72
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
73
|
+
resp
|
|
74
|
+
end
|
|
75
|
+
# Get reads one AccountAttachment by ID.
|
|
76
|
+
def get(
|
|
77
|
+
id \
|
|
78
|
+
,
|
|
79
|
+
deadline:nil)
|
|
80
|
+
req = V1::AccountAttachmentGetRequest.new()
|
|
81
|
+
|
|
82
|
+
req.id = id
|
|
83
|
+
tries = 0
|
|
84
|
+
plumbing_response = nil
|
|
85
|
+
loop do
|
|
86
|
+
begin
|
|
87
|
+
plumbing_response = @stub.get(req, metadata: @parent.get_metadata('AccountAttachments.Get', req), deadline:deadline)
|
|
88
|
+
rescue => exception
|
|
89
|
+
if (@parent.shouldRetry(tries, exception))
|
|
90
|
+
tries++
|
|
91
|
+
@parent.jitterSleep(tries)
|
|
92
|
+
next
|
|
93
|
+
end
|
|
94
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
95
|
+
end
|
|
96
|
+
break
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
resp = AccountAttachmentGetResponse.new()
|
|
101
|
+
resp.meta = Plumbing::get_response_metadata_to_porcelain(plumbing_response.meta)
|
|
102
|
+
resp.account_attachment = Plumbing::account_attachment_to_porcelain(plumbing_response.account_attachment)
|
|
103
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
104
|
+
resp
|
|
105
|
+
end
|
|
106
|
+
# Delete removes a AccountAttachment by ID.
|
|
107
|
+
def delete(
|
|
108
|
+
id \
|
|
109
|
+
,
|
|
110
|
+
deadline:nil)
|
|
111
|
+
req = V1::AccountAttachmentDeleteRequest.new()
|
|
112
|
+
|
|
113
|
+
req.id = id
|
|
114
|
+
tries = 0
|
|
115
|
+
plumbing_response = nil
|
|
116
|
+
loop do
|
|
117
|
+
begin
|
|
118
|
+
plumbing_response = @stub.delete(req, metadata: @parent.get_metadata('AccountAttachments.Delete', req), deadline:deadline)
|
|
119
|
+
rescue => exception
|
|
120
|
+
if (@parent.shouldRetry(tries, exception))
|
|
121
|
+
tries++
|
|
122
|
+
@parent.jitterSleep(tries)
|
|
123
|
+
next
|
|
124
|
+
end
|
|
125
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
126
|
+
end
|
|
127
|
+
break
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
resp = AccountAttachmentDeleteResponse.new()
|
|
132
|
+
resp.meta = Plumbing::delete_response_metadata_to_porcelain(plumbing_response.meta)
|
|
133
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
134
|
+
resp
|
|
135
|
+
end
|
|
136
|
+
# List gets a list of AccountAttachments matching a given set of criteria.
|
|
137
|
+
def list(
|
|
138
|
+
filter \
|
|
139
|
+
,
|
|
140
|
+
*args,
|
|
141
|
+
deadline:nil)
|
|
142
|
+
req = V1::AccountAttachmentListRequest.new()
|
|
143
|
+
req.meta = V1::ListRequestMetadata.new()
|
|
144
|
+
page_size_option = @parent._test_options['PageSize']
|
|
145
|
+
if page_size_option.is_a? Integer
|
|
146
|
+
req.meta.limit = page_size_option
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
req.filter = Plumbing::quote_filter_args(filter, *args)
|
|
150
|
+
resp = Enumerator::Generator.new { |g|
|
|
151
|
+
tries = 0
|
|
152
|
+
loop do
|
|
153
|
+
begin
|
|
154
|
+
plumbing_response = @stub.list(req, metadata: @parent.get_metadata('AccountAttachments.List', req), deadline:deadline)
|
|
155
|
+
rescue => exception
|
|
156
|
+
if (@parent.shouldRetry(tries, exception))
|
|
157
|
+
tries++
|
|
158
|
+
@parent.jitterSleep(tries)
|
|
159
|
+
next
|
|
160
|
+
end
|
|
161
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
162
|
+
end
|
|
163
|
+
tries = 0
|
|
164
|
+
plumbing_response.account_attachments.each do |plumbing_item|
|
|
165
|
+
g.yield Plumbing::account_attachment_to_porcelain(plumbing_item)
|
|
166
|
+
end
|
|
167
|
+
break if plumbing_response.meta.next_cursor == ""
|
|
168
|
+
req.meta.cursor = plumbing_response.meta.next_cursor
|
|
169
|
+
end
|
|
170
|
+
}
|
|
171
|
+
resp
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
# AccountGrants connect a resource directly to an account, giving the account the permission to connect to that resource.
|
|
175
|
+
class AccountGrants
|
|
176
|
+
def initialize(host, insecure, parent)
|
|
177
|
+
begin
|
|
178
|
+
if insecure
|
|
179
|
+
@stub = V1::AccountGrants::Stub.new(host, :this_channel_is_insecure)
|
|
180
|
+
else
|
|
181
|
+
cred = GRPC::Core::ChannelCredentials.new()
|
|
182
|
+
@stub = V1::AccountGrants::Stub.new(host, cred)
|
|
183
|
+
end
|
|
184
|
+
rescue => exception
|
|
185
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
186
|
+
end
|
|
187
|
+
@parent = parent
|
|
188
|
+
end
|
|
189
|
+
# Create registers a new AccountGrant.
|
|
190
|
+
def create(
|
|
191
|
+
account_grant \
|
|
192
|
+
,
|
|
193
|
+
deadline:nil)
|
|
194
|
+
req = V1::AccountGrantCreateRequest.new()
|
|
195
|
+
|
|
196
|
+
req.account_grant = Plumbing::account_grant_to_plumbing(account_grant)
|
|
197
|
+
tries = 0
|
|
198
|
+
plumbing_response = nil
|
|
199
|
+
loop do
|
|
200
|
+
begin
|
|
201
|
+
plumbing_response = @stub.create(req, metadata: @parent.get_metadata('AccountGrants.Create', req), deadline:deadline)
|
|
202
|
+
rescue => exception
|
|
203
|
+
if (@parent.shouldRetry(tries, exception))
|
|
204
|
+
tries++
|
|
205
|
+
@parent.jitterSleep(tries)
|
|
206
|
+
next
|
|
207
|
+
end
|
|
208
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
209
|
+
end
|
|
210
|
+
break
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
resp = AccountGrantCreateResponse.new()
|
|
215
|
+
resp.meta = Plumbing::create_response_metadata_to_porcelain(plumbing_response.meta)
|
|
216
|
+
resp.account_grant = Plumbing::account_grant_to_porcelain(plumbing_response.account_grant)
|
|
217
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
218
|
+
resp
|
|
219
|
+
end
|
|
220
|
+
# Get reads one AccountGrant by ID.
|
|
221
|
+
def get(
|
|
222
|
+
id \
|
|
223
|
+
,
|
|
224
|
+
deadline:nil)
|
|
225
|
+
req = V1::AccountGrantGetRequest.new()
|
|
226
|
+
|
|
227
|
+
req.id = id
|
|
228
|
+
tries = 0
|
|
229
|
+
plumbing_response = nil
|
|
230
|
+
loop do
|
|
231
|
+
begin
|
|
232
|
+
plumbing_response = @stub.get(req, metadata: @parent.get_metadata('AccountGrants.Get', req), deadline:deadline)
|
|
233
|
+
rescue => exception
|
|
234
|
+
if (@parent.shouldRetry(tries, exception))
|
|
235
|
+
tries++
|
|
236
|
+
@parent.jitterSleep(tries)
|
|
237
|
+
next
|
|
238
|
+
end
|
|
239
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
240
|
+
end
|
|
241
|
+
break
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
resp = AccountGrantGetResponse.new()
|
|
246
|
+
resp.meta = Plumbing::get_response_metadata_to_porcelain(plumbing_response.meta)
|
|
247
|
+
resp.account_grant = Plumbing::account_grant_to_porcelain(plumbing_response.account_grant)
|
|
248
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
249
|
+
resp
|
|
250
|
+
end
|
|
251
|
+
# Delete removes a AccountGrant by ID.
|
|
252
|
+
def delete(
|
|
253
|
+
id \
|
|
254
|
+
,
|
|
255
|
+
deadline:nil)
|
|
256
|
+
req = V1::AccountGrantDeleteRequest.new()
|
|
257
|
+
|
|
258
|
+
req.id = id
|
|
259
|
+
tries = 0
|
|
260
|
+
plumbing_response = nil
|
|
261
|
+
loop do
|
|
262
|
+
begin
|
|
263
|
+
plumbing_response = @stub.delete(req, metadata: @parent.get_metadata('AccountGrants.Delete', req), deadline:deadline)
|
|
264
|
+
rescue => exception
|
|
265
|
+
if (@parent.shouldRetry(tries, exception))
|
|
266
|
+
tries++
|
|
267
|
+
@parent.jitterSleep(tries)
|
|
268
|
+
next
|
|
269
|
+
end
|
|
270
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
271
|
+
end
|
|
272
|
+
break
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
resp = AccountGrantDeleteResponse.new()
|
|
277
|
+
resp.meta = Plumbing::delete_response_metadata_to_porcelain(plumbing_response.meta)
|
|
278
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
279
|
+
resp
|
|
280
|
+
end
|
|
281
|
+
# List gets a list of AccountGrants matching a given set of criteria.
|
|
282
|
+
def list(
|
|
283
|
+
filter \
|
|
284
|
+
,
|
|
285
|
+
*args,
|
|
286
|
+
deadline:nil)
|
|
287
|
+
req = V1::AccountGrantListRequest.new()
|
|
288
|
+
req.meta = V1::ListRequestMetadata.new()
|
|
289
|
+
page_size_option = @parent._test_options['PageSize']
|
|
290
|
+
if page_size_option.is_a? Integer
|
|
291
|
+
req.meta.limit = page_size_option
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
req.filter = Plumbing::quote_filter_args(filter, *args)
|
|
295
|
+
resp = Enumerator::Generator.new { |g|
|
|
296
|
+
tries = 0
|
|
297
|
+
loop do
|
|
298
|
+
begin
|
|
299
|
+
plumbing_response = @stub.list(req, metadata: @parent.get_metadata('AccountGrants.List', req), deadline:deadline)
|
|
300
|
+
rescue => exception
|
|
301
|
+
if (@parent.shouldRetry(tries, exception))
|
|
302
|
+
tries++
|
|
303
|
+
@parent.jitterSleep(tries)
|
|
304
|
+
next
|
|
305
|
+
end
|
|
306
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
307
|
+
end
|
|
308
|
+
tries = 0
|
|
309
|
+
plumbing_response.account_grants.each do |plumbing_item|
|
|
310
|
+
g.yield Plumbing::account_grant_to_porcelain(plumbing_item)
|
|
311
|
+
end
|
|
312
|
+
break if plumbing_response.meta.next_cursor == ""
|
|
313
|
+
req.meta.cursor = plumbing_response.meta.next_cursor
|
|
314
|
+
end
|
|
315
|
+
}
|
|
316
|
+
resp
|
|
317
|
+
end
|
|
318
|
+
end
|
|
319
|
+
# Accounts are users that have access to strongDM.
|
|
320
|
+
# There are two types of accounts:
|
|
321
|
+
# 1. **Regular users:** humans who are authenticated through username and password or SSO
|
|
322
|
+
# 2. **Service users:** machines that are authneticated using a service token
|
|
323
|
+
class Accounts
|
|
324
|
+
def initialize(host, insecure, parent)
|
|
325
|
+
begin
|
|
326
|
+
if insecure
|
|
327
|
+
@stub = V1::Accounts::Stub.new(host, :this_channel_is_insecure)
|
|
328
|
+
else
|
|
329
|
+
cred = GRPC::Core::ChannelCredentials.new()
|
|
330
|
+
@stub = V1::Accounts::Stub.new(host, cred)
|
|
331
|
+
end
|
|
332
|
+
rescue => exception
|
|
333
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
334
|
+
end
|
|
335
|
+
@parent = parent
|
|
336
|
+
end
|
|
337
|
+
# Create registers a new Account.
|
|
338
|
+
def create(
|
|
339
|
+
account \
|
|
340
|
+
,
|
|
341
|
+
deadline:nil)
|
|
342
|
+
req = V1::AccountCreateRequest.new()
|
|
343
|
+
|
|
344
|
+
req.account = Plumbing::account_to_plumbing(account)
|
|
345
|
+
tries = 0
|
|
346
|
+
plumbing_response = nil
|
|
347
|
+
loop do
|
|
348
|
+
begin
|
|
349
|
+
plumbing_response = @stub.create(req, metadata: @parent.get_metadata('Accounts.Create', req), deadline:deadline)
|
|
350
|
+
rescue => exception
|
|
351
|
+
if (@parent.shouldRetry(tries, exception))
|
|
352
|
+
tries++
|
|
353
|
+
@parent.jitterSleep(tries)
|
|
354
|
+
next
|
|
355
|
+
end
|
|
356
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
357
|
+
end
|
|
358
|
+
break
|
|
359
|
+
end
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
resp = AccountCreateResponse.new()
|
|
363
|
+
resp.meta = Plumbing::create_response_metadata_to_porcelain(plumbing_response.meta)
|
|
364
|
+
resp.account = Plumbing::account_to_porcelain(plumbing_response.account)
|
|
365
|
+
resp.token = plumbing_response.token
|
|
366
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
367
|
+
resp
|
|
368
|
+
end
|
|
369
|
+
# Get reads one Account by ID.
|
|
370
|
+
def get(
|
|
371
|
+
id \
|
|
372
|
+
,
|
|
373
|
+
deadline:nil)
|
|
374
|
+
req = V1::AccountGetRequest.new()
|
|
375
|
+
|
|
376
|
+
req.id = id
|
|
377
|
+
tries = 0
|
|
378
|
+
plumbing_response = nil
|
|
379
|
+
loop do
|
|
380
|
+
begin
|
|
381
|
+
plumbing_response = @stub.get(req, metadata: @parent.get_metadata('Accounts.Get', req), deadline:deadline)
|
|
382
|
+
rescue => exception
|
|
383
|
+
if (@parent.shouldRetry(tries, exception))
|
|
384
|
+
tries++
|
|
385
|
+
@parent.jitterSleep(tries)
|
|
386
|
+
next
|
|
387
|
+
end
|
|
388
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
389
|
+
end
|
|
390
|
+
break
|
|
391
|
+
end
|
|
392
|
+
|
|
393
|
+
|
|
394
|
+
resp = AccountGetResponse.new()
|
|
395
|
+
resp.meta = Plumbing::get_response_metadata_to_porcelain(plumbing_response.meta)
|
|
396
|
+
resp.account = Plumbing::account_to_porcelain(plumbing_response.account)
|
|
397
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
398
|
+
resp
|
|
399
|
+
end
|
|
400
|
+
# Update patches a Account by ID.
|
|
401
|
+
def update(
|
|
402
|
+
account \
|
|
403
|
+
,
|
|
404
|
+
deadline:nil)
|
|
405
|
+
req = V1::AccountUpdateRequest.new()
|
|
406
|
+
|
|
407
|
+
req.account = Plumbing::account_to_plumbing(account)
|
|
408
|
+
tries = 0
|
|
409
|
+
plumbing_response = nil
|
|
410
|
+
loop do
|
|
411
|
+
begin
|
|
412
|
+
plumbing_response = @stub.update(req, metadata: @parent.get_metadata('Accounts.Update', req), deadline:deadline)
|
|
413
|
+
rescue => exception
|
|
414
|
+
if (@parent.shouldRetry(tries, exception))
|
|
415
|
+
tries++
|
|
416
|
+
@parent.jitterSleep(tries)
|
|
417
|
+
next
|
|
418
|
+
end
|
|
419
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
420
|
+
end
|
|
421
|
+
break
|
|
422
|
+
end
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
resp = AccountUpdateResponse.new()
|
|
426
|
+
resp.meta = Plumbing::update_response_metadata_to_porcelain(plumbing_response.meta)
|
|
427
|
+
resp.account = Plumbing::account_to_porcelain(plumbing_response.account)
|
|
428
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
429
|
+
resp
|
|
430
|
+
end
|
|
431
|
+
# Delete removes a Account by ID.
|
|
432
|
+
def delete(
|
|
433
|
+
id \
|
|
434
|
+
,
|
|
435
|
+
deadline:nil)
|
|
436
|
+
req = V1::AccountDeleteRequest.new()
|
|
437
|
+
|
|
438
|
+
req.id = id
|
|
439
|
+
tries = 0
|
|
440
|
+
plumbing_response = nil
|
|
441
|
+
loop do
|
|
442
|
+
begin
|
|
443
|
+
plumbing_response = @stub.delete(req, metadata: @parent.get_metadata('Accounts.Delete', req), deadline:deadline)
|
|
444
|
+
rescue => exception
|
|
445
|
+
if (@parent.shouldRetry(tries, exception))
|
|
446
|
+
tries++
|
|
447
|
+
@parent.jitterSleep(tries)
|
|
448
|
+
next
|
|
449
|
+
end
|
|
450
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
451
|
+
end
|
|
452
|
+
break
|
|
453
|
+
end
|
|
454
|
+
|
|
455
|
+
|
|
456
|
+
resp = AccountDeleteResponse.new()
|
|
457
|
+
resp.meta = Plumbing::delete_response_metadata_to_porcelain(plumbing_response.meta)
|
|
458
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
459
|
+
resp
|
|
460
|
+
end
|
|
461
|
+
# List gets a list of Accounts matching a given set of criteria.
|
|
462
|
+
def list(
|
|
463
|
+
filter \
|
|
464
|
+
,
|
|
465
|
+
*args,
|
|
466
|
+
deadline:nil)
|
|
467
|
+
req = V1::AccountListRequest.new()
|
|
468
|
+
req.meta = V1::ListRequestMetadata.new()
|
|
469
|
+
page_size_option = @parent._test_options['PageSize']
|
|
470
|
+
if page_size_option.is_a? Integer
|
|
471
|
+
req.meta.limit = page_size_option
|
|
472
|
+
end
|
|
473
|
+
|
|
474
|
+
req.filter = Plumbing::quote_filter_args(filter, *args)
|
|
475
|
+
resp = Enumerator::Generator.new { |g|
|
|
476
|
+
tries = 0
|
|
477
|
+
loop do
|
|
478
|
+
begin
|
|
479
|
+
plumbing_response = @stub.list(req, metadata: @parent.get_metadata('Accounts.List', req), deadline:deadline)
|
|
480
|
+
rescue => exception
|
|
481
|
+
if (@parent.shouldRetry(tries, exception))
|
|
482
|
+
tries++
|
|
483
|
+
@parent.jitterSleep(tries)
|
|
484
|
+
next
|
|
485
|
+
end
|
|
486
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
487
|
+
end
|
|
488
|
+
tries = 0
|
|
489
|
+
plumbing_response.accounts.each do |plumbing_item|
|
|
490
|
+
g.yield Plumbing::account_to_porcelain(plumbing_item)
|
|
491
|
+
end
|
|
492
|
+
break if plumbing_response.meta.next_cursor == ""
|
|
493
|
+
req.meta.cursor = plumbing_response.meta.next_cursor
|
|
494
|
+
end
|
|
495
|
+
}
|
|
496
|
+
resp
|
|
497
|
+
end
|
|
498
|
+
end
|
|
499
|
+
# Nodes make up the strongDM network, and allow your users to connect securely to your resources.
|
|
500
|
+
# There are two types of nodes:
|
|
501
|
+
# 1. **Relay:** creates connectivity to your datasources, while maintaining the egress-only nature of your firewall
|
|
502
|
+
# 1. **Gateways:** a relay that also listens for connections from strongDM clients
|
|
503
|
+
class Nodes
|
|
504
|
+
def initialize(host, insecure, parent)
|
|
505
|
+
begin
|
|
506
|
+
if insecure
|
|
507
|
+
@stub = V1::Nodes::Stub.new(host, :this_channel_is_insecure)
|
|
508
|
+
else
|
|
509
|
+
cred = GRPC::Core::ChannelCredentials.new()
|
|
510
|
+
@stub = V1::Nodes::Stub.new(host, cred)
|
|
511
|
+
end
|
|
512
|
+
rescue => exception
|
|
513
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
514
|
+
end
|
|
515
|
+
@parent = parent
|
|
516
|
+
end
|
|
517
|
+
# Create registers a new Node.
|
|
518
|
+
def create(
|
|
519
|
+
node \
|
|
520
|
+
,
|
|
521
|
+
deadline:nil)
|
|
522
|
+
req = V1::NodeCreateRequest.new()
|
|
523
|
+
|
|
524
|
+
req.node = Plumbing::node_to_plumbing(node)
|
|
525
|
+
tries = 0
|
|
526
|
+
plumbing_response = nil
|
|
527
|
+
loop do
|
|
528
|
+
begin
|
|
529
|
+
plumbing_response = @stub.create(req, metadata: @parent.get_metadata('Nodes.Create', req), deadline:deadline)
|
|
530
|
+
rescue => exception
|
|
531
|
+
if (@parent.shouldRetry(tries, exception))
|
|
532
|
+
tries++
|
|
533
|
+
@parent.jitterSleep(tries)
|
|
534
|
+
next
|
|
535
|
+
end
|
|
536
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
537
|
+
end
|
|
538
|
+
break
|
|
539
|
+
end
|
|
540
|
+
|
|
541
|
+
|
|
542
|
+
resp = NodeCreateResponse.new()
|
|
543
|
+
resp.meta = Plumbing::create_response_metadata_to_porcelain(plumbing_response.meta)
|
|
544
|
+
resp.node = Plumbing::node_to_porcelain(plumbing_response.node)
|
|
545
|
+
resp.token = plumbing_response.token
|
|
546
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
547
|
+
resp
|
|
548
|
+
end
|
|
549
|
+
# Get reads one Node by ID.
|
|
550
|
+
def get(
|
|
551
|
+
id \
|
|
552
|
+
,
|
|
553
|
+
deadline:nil)
|
|
554
|
+
req = V1::NodeGetRequest.new()
|
|
555
|
+
|
|
556
|
+
req.id = id
|
|
557
|
+
tries = 0
|
|
558
|
+
plumbing_response = nil
|
|
559
|
+
loop do
|
|
560
|
+
begin
|
|
561
|
+
plumbing_response = @stub.get(req, metadata: @parent.get_metadata('Nodes.Get', req), deadline:deadline)
|
|
562
|
+
rescue => exception
|
|
563
|
+
if (@parent.shouldRetry(tries, exception))
|
|
564
|
+
tries++
|
|
565
|
+
@parent.jitterSleep(tries)
|
|
566
|
+
next
|
|
567
|
+
end
|
|
568
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
569
|
+
end
|
|
570
|
+
break
|
|
571
|
+
end
|
|
572
|
+
|
|
573
|
+
|
|
574
|
+
resp = NodeGetResponse.new()
|
|
575
|
+
resp.meta = Plumbing::get_response_metadata_to_porcelain(plumbing_response.meta)
|
|
576
|
+
resp.node = Plumbing::node_to_porcelain(plumbing_response.node)
|
|
577
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
578
|
+
resp
|
|
579
|
+
end
|
|
580
|
+
# Update patches a Node by ID.
|
|
581
|
+
def update(
|
|
582
|
+
node \
|
|
583
|
+
,
|
|
584
|
+
deadline:nil)
|
|
585
|
+
req = V1::NodeUpdateRequest.new()
|
|
586
|
+
|
|
587
|
+
req.node = Plumbing::node_to_plumbing(node)
|
|
588
|
+
tries = 0
|
|
589
|
+
plumbing_response = nil
|
|
590
|
+
loop do
|
|
591
|
+
begin
|
|
592
|
+
plumbing_response = @stub.update(req, metadata: @parent.get_metadata('Nodes.Update', req), deadline:deadline)
|
|
593
|
+
rescue => exception
|
|
594
|
+
if (@parent.shouldRetry(tries, exception))
|
|
595
|
+
tries++
|
|
596
|
+
@parent.jitterSleep(tries)
|
|
597
|
+
next
|
|
598
|
+
end
|
|
599
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
600
|
+
end
|
|
601
|
+
break
|
|
602
|
+
end
|
|
603
|
+
|
|
604
|
+
|
|
605
|
+
resp = NodeUpdateResponse.new()
|
|
606
|
+
resp.meta = Plumbing::update_response_metadata_to_porcelain(plumbing_response.meta)
|
|
607
|
+
resp.node = Plumbing::node_to_porcelain(plumbing_response.node)
|
|
608
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
609
|
+
resp
|
|
610
|
+
end
|
|
611
|
+
# Delete removes a Node by ID.
|
|
612
|
+
def delete(
|
|
613
|
+
id \
|
|
614
|
+
,
|
|
615
|
+
deadline:nil)
|
|
616
|
+
req = V1::NodeDeleteRequest.new()
|
|
617
|
+
|
|
618
|
+
req.id = id
|
|
619
|
+
tries = 0
|
|
620
|
+
plumbing_response = nil
|
|
621
|
+
loop do
|
|
622
|
+
begin
|
|
623
|
+
plumbing_response = @stub.delete(req, metadata: @parent.get_metadata('Nodes.Delete', req), deadline:deadline)
|
|
624
|
+
rescue => exception
|
|
625
|
+
if (@parent.shouldRetry(tries, exception))
|
|
626
|
+
tries++
|
|
627
|
+
@parent.jitterSleep(tries)
|
|
628
|
+
next
|
|
629
|
+
end
|
|
630
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
631
|
+
end
|
|
632
|
+
break
|
|
633
|
+
end
|
|
634
|
+
|
|
635
|
+
|
|
636
|
+
resp = NodeDeleteResponse.new()
|
|
637
|
+
resp.meta = Plumbing::delete_response_metadata_to_porcelain(plumbing_response.meta)
|
|
638
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
639
|
+
resp
|
|
640
|
+
end
|
|
641
|
+
# List gets a list of Nodes matching a given set of criteria.
|
|
642
|
+
def list(
|
|
643
|
+
filter \
|
|
644
|
+
,
|
|
645
|
+
*args,
|
|
646
|
+
deadline:nil)
|
|
647
|
+
req = V1::NodeListRequest.new()
|
|
648
|
+
req.meta = V1::ListRequestMetadata.new()
|
|
649
|
+
page_size_option = @parent._test_options['PageSize']
|
|
650
|
+
if page_size_option.is_a? Integer
|
|
651
|
+
req.meta.limit = page_size_option
|
|
652
|
+
end
|
|
653
|
+
|
|
654
|
+
req.filter = Plumbing::quote_filter_args(filter, *args)
|
|
655
|
+
resp = Enumerator::Generator.new { |g|
|
|
656
|
+
tries = 0
|
|
657
|
+
loop do
|
|
658
|
+
begin
|
|
659
|
+
plumbing_response = @stub.list(req, metadata: @parent.get_metadata('Nodes.List', req), deadline:deadline)
|
|
660
|
+
rescue => exception
|
|
661
|
+
if (@parent.shouldRetry(tries, exception))
|
|
662
|
+
tries++
|
|
663
|
+
@parent.jitterSleep(tries)
|
|
664
|
+
next
|
|
665
|
+
end
|
|
666
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
667
|
+
end
|
|
668
|
+
tries = 0
|
|
669
|
+
plumbing_response.nodes.each do |plumbing_item|
|
|
670
|
+
g.yield Plumbing::node_to_porcelain(plumbing_item)
|
|
671
|
+
end
|
|
672
|
+
break if plumbing_response.meta.next_cursor == ""
|
|
673
|
+
req.meta.cursor = plumbing_response.meta.next_cursor
|
|
674
|
+
end
|
|
675
|
+
}
|
|
676
|
+
resp
|
|
677
|
+
end
|
|
678
|
+
end
|
|
679
|
+
|
|
680
|
+
class Resources
|
|
681
|
+
def initialize(host, insecure, parent)
|
|
682
|
+
begin
|
|
683
|
+
if insecure
|
|
684
|
+
@stub = V1::Resources::Stub.new(host, :this_channel_is_insecure)
|
|
685
|
+
else
|
|
686
|
+
cred = GRPC::Core::ChannelCredentials.new()
|
|
687
|
+
@stub = V1::Resources::Stub.new(host, cred)
|
|
688
|
+
end
|
|
689
|
+
rescue => exception
|
|
690
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
691
|
+
end
|
|
692
|
+
@parent = parent
|
|
693
|
+
end
|
|
694
|
+
# Create registers a new Resource.
|
|
695
|
+
def create(
|
|
696
|
+
resource \
|
|
697
|
+
,
|
|
698
|
+
deadline:nil)
|
|
699
|
+
req = V1::ResourceCreateRequest.new()
|
|
700
|
+
|
|
701
|
+
req.resource = Plumbing::resource_to_plumbing(resource)
|
|
702
|
+
tries = 0
|
|
703
|
+
plumbing_response = nil
|
|
704
|
+
loop do
|
|
705
|
+
begin
|
|
706
|
+
plumbing_response = @stub.create(req, metadata: @parent.get_metadata('Resources.Create', req), deadline:deadline)
|
|
707
|
+
rescue => exception
|
|
708
|
+
if (@parent.shouldRetry(tries, exception))
|
|
709
|
+
tries++
|
|
710
|
+
@parent.jitterSleep(tries)
|
|
711
|
+
next
|
|
712
|
+
end
|
|
713
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
714
|
+
end
|
|
715
|
+
break
|
|
716
|
+
end
|
|
717
|
+
|
|
718
|
+
|
|
719
|
+
resp = ResourceCreateResponse.new()
|
|
720
|
+
resp.meta = Plumbing::create_response_metadata_to_porcelain(plumbing_response.meta)
|
|
721
|
+
resp.resource = Plumbing::resource_to_porcelain(plumbing_response.resource)
|
|
722
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
723
|
+
resp
|
|
724
|
+
end
|
|
725
|
+
# Get reads one Resource by ID.
|
|
726
|
+
def get(
|
|
727
|
+
id \
|
|
728
|
+
,
|
|
729
|
+
deadline:nil)
|
|
730
|
+
req = V1::ResourceGetRequest.new()
|
|
731
|
+
|
|
732
|
+
req.id = id
|
|
733
|
+
tries = 0
|
|
734
|
+
plumbing_response = nil
|
|
735
|
+
loop do
|
|
736
|
+
begin
|
|
737
|
+
plumbing_response = @stub.get(req, metadata: @parent.get_metadata('Resources.Get', req), deadline:deadline)
|
|
738
|
+
rescue => exception
|
|
739
|
+
if (@parent.shouldRetry(tries, exception))
|
|
740
|
+
tries++
|
|
741
|
+
@parent.jitterSleep(tries)
|
|
742
|
+
next
|
|
743
|
+
end
|
|
744
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
745
|
+
end
|
|
746
|
+
break
|
|
747
|
+
end
|
|
748
|
+
|
|
749
|
+
|
|
750
|
+
resp = ResourceGetResponse.new()
|
|
751
|
+
resp.meta = Plumbing::get_response_metadata_to_porcelain(plumbing_response.meta)
|
|
752
|
+
resp.resource = Plumbing::resource_to_porcelain(plumbing_response.resource)
|
|
753
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
754
|
+
resp
|
|
755
|
+
end
|
|
756
|
+
# Update patches a Resource by ID.
|
|
757
|
+
def update(
|
|
758
|
+
resource \
|
|
759
|
+
,
|
|
760
|
+
deadline:nil)
|
|
761
|
+
req = V1::ResourceUpdateRequest.new()
|
|
762
|
+
|
|
763
|
+
req.resource = Plumbing::resource_to_plumbing(resource)
|
|
764
|
+
tries = 0
|
|
765
|
+
plumbing_response = nil
|
|
766
|
+
loop do
|
|
767
|
+
begin
|
|
768
|
+
plumbing_response = @stub.update(req, metadata: @parent.get_metadata('Resources.Update', req), deadline:deadline)
|
|
769
|
+
rescue => exception
|
|
770
|
+
if (@parent.shouldRetry(tries, exception))
|
|
771
|
+
tries++
|
|
772
|
+
@parent.jitterSleep(tries)
|
|
773
|
+
next
|
|
774
|
+
end
|
|
775
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
776
|
+
end
|
|
777
|
+
break
|
|
778
|
+
end
|
|
779
|
+
|
|
780
|
+
|
|
781
|
+
resp = ResourceUpdateResponse.new()
|
|
782
|
+
resp.meta = Plumbing::update_response_metadata_to_porcelain(plumbing_response.meta)
|
|
783
|
+
resp.resource = Plumbing::resource_to_porcelain(plumbing_response.resource)
|
|
784
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
785
|
+
resp
|
|
786
|
+
end
|
|
787
|
+
# Delete removes a Resource by ID.
|
|
788
|
+
def delete(
|
|
789
|
+
id \
|
|
790
|
+
,
|
|
791
|
+
deadline:nil)
|
|
792
|
+
req = V1::ResourceDeleteRequest.new()
|
|
793
|
+
|
|
794
|
+
req.id = id
|
|
795
|
+
tries = 0
|
|
796
|
+
plumbing_response = nil
|
|
797
|
+
loop do
|
|
798
|
+
begin
|
|
799
|
+
plumbing_response = @stub.delete(req, metadata: @parent.get_metadata('Resources.Delete', req), deadline:deadline)
|
|
800
|
+
rescue => exception
|
|
801
|
+
if (@parent.shouldRetry(tries, exception))
|
|
802
|
+
tries++
|
|
803
|
+
@parent.jitterSleep(tries)
|
|
804
|
+
next
|
|
805
|
+
end
|
|
806
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
807
|
+
end
|
|
808
|
+
break
|
|
809
|
+
end
|
|
810
|
+
|
|
811
|
+
|
|
812
|
+
resp = ResourceDeleteResponse.new()
|
|
813
|
+
resp.meta = Plumbing::delete_response_metadata_to_porcelain(plumbing_response.meta)
|
|
814
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
815
|
+
resp
|
|
816
|
+
end
|
|
817
|
+
# List gets a list of Resources matching a given set of criteria.
|
|
818
|
+
def list(
|
|
819
|
+
filter \
|
|
820
|
+
,
|
|
821
|
+
*args,
|
|
822
|
+
deadline:nil)
|
|
823
|
+
req = V1::ResourceListRequest.new()
|
|
824
|
+
req.meta = V1::ListRequestMetadata.new()
|
|
825
|
+
page_size_option = @parent._test_options['PageSize']
|
|
826
|
+
if page_size_option.is_a? Integer
|
|
827
|
+
req.meta.limit = page_size_option
|
|
828
|
+
end
|
|
829
|
+
|
|
830
|
+
req.filter = Plumbing::quote_filter_args(filter, *args)
|
|
831
|
+
resp = Enumerator::Generator.new { |g|
|
|
832
|
+
tries = 0
|
|
833
|
+
loop do
|
|
834
|
+
begin
|
|
835
|
+
plumbing_response = @stub.list(req, metadata: @parent.get_metadata('Resources.List', req), deadline:deadline)
|
|
836
|
+
rescue => exception
|
|
837
|
+
if (@parent.shouldRetry(tries, exception))
|
|
838
|
+
tries++
|
|
839
|
+
@parent.jitterSleep(tries)
|
|
840
|
+
next
|
|
841
|
+
end
|
|
842
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
843
|
+
end
|
|
844
|
+
tries = 0
|
|
845
|
+
plumbing_response.resources.each do |plumbing_item|
|
|
846
|
+
g.yield Plumbing::resource_to_porcelain(plumbing_item)
|
|
847
|
+
end
|
|
848
|
+
break if plumbing_response.meta.next_cursor == ""
|
|
849
|
+
req.meta.cursor = plumbing_response.meta.next_cursor
|
|
850
|
+
end
|
|
851
|
+
}
|
|
852
|
+
resp
|
|
853
|
+
end
|
|
854
|
+
end
|
|
855
|
+
# RoleAttachments represent relationships between composite roles and the roles
|
|
856
|
+
# that make up those composite roles. When a composite role is attached to another
|
|
857
|
+
# role, the permissions granted to members of the composite role are augmented to
|
|
858
|
+
# include the permissions granted to members of the attached role.
|
|
859
|
+
class RoleAttachments
|
|
860
|
+
def initialize(host, insecure, parent)
|
|
861
|
+
begin
|
|
862
|
+
if insecure
|
|
863
|
+
@stub = V1::RoleAttachments::Stub.new(host, :this_channel_is_insecure)
|
|
864
|
+
else
|
|
865
|
+
cred = GRPC::Core::ChannelCredentials.new()
|
|
866
|
+
@stub = V1::RoleAttachments::Stub.new(host, cred)
|
|
867
|
+
end
|
|
868
|
+
rescue => exception
|
|
869
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
870
|
+
end
|
|
871
|
+
@parent = parent
|
|
872
|
+
end
|
|
873
|
+
# Create registers a new RoleAttachment.
|
|
874
|
+
def create(
|
|
875
|
+
role_attachment \
|
|
876
|
+
,
|
|
877
|
+
deadline:nil)
|
|
878
|
+
req = V1::RoleAttachmentCreateRequest.new()
|
|
879
|
+
|
|
880
|
+
req.role_attachment = Plumbing::role_attachment_to_plumbing(role_attachment)
|
|
881
|
+
tries = 0
|
|
882
|
+
plumbing_response = nil
|
|
883
|
+
loop do
|
|
884
|
+
begin
|
|
885
|
+
plumbing_response = @stub.create(req, metadata: @parent.get_metadata('RoleAttachments.Create', req), deadline:deadline)
|
|
886
|
+
rescue => exception
|
|
887
|
+
if (@parent.shouldRetry(tries, exception))
|
|
888
|
+
tries++
|
|
889
|
+
@parent.jitterSleep(tries)
|
|
890
|
+
next
|
|
891
|
+
end
|
|
892
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
893
|
+
end
|
|
894
|
+
break
|
|
895
|
+
end
|
|
896
|
+
|
|
897
|
+
|
|
898
|
+
resp = RoleAttachmentCreateResponse.new()
|
|
899
|
+
resp.meta = Plumbing::create_response_metadata_to_porcelain(plumbing_response.meta)
|
|
900
|
+
resp.role_attachment = Plumbing::role_attachment_to_porcelain(plumbing_response.role_attachment)
|
|
901
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
902
|
+
resp
|
|
903
|
+
end
|
|
904
|
+
# Get reads one RoleAttachment by ID.
|
|
905
|
+
def get(
|
|
906
|
+
id \
|
|
907
|
+
,
|
|
908
|
+
deadline:nil)
|
|
909
|
+
req = V1::RoleAttachmentGetRequest.new()
|
|
910
|
+
|
|
911
|
+
req.id = id
|
|
912
|
+
tries = 0
|
|
913
|
+
plumbing_response = nil
|
|
914
|
+
loop do
|
|
915
|
+
begin
|
|
916
|
+
plumbing_response = @stub.get(req, metadata: @parent.get_metadata('RoleAttachments.Get', req), deadline:deadline)
|
|
917
|
+
rescue => exception
|
|
918
|
+
if (@parent.shouldRetry(tries, exception))
|
|
919
|
+
tries++
|
|
920
|
+
@parent.jitterSleep(tries)
|
|
921
|
+
next
|
|
922
|
+
end
|
|
923
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
924
|
+
end
|
|
925
|
+
break
|
|
926
|
+
end
|
|
927
|
+
|
|
928
|
+
|
|
929
|
+
resp = RoleAttachmentGetResponse.new()
|
|
930
|
+
resp.meta = Plumbing::get_response_metadata_to_porcelain(plumbing_response.meta)
|
|
931
|
+
resp.role_attachment = Plumbing::role_attachment_to_porcelain(plumbing_response.role_attachment)
|
|
932
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
933
|
+
resp
|
|
934
|
+
end
|
|
935
|
+
# Delete removes a RoleAttachment by ID.
|
|
936
|
+
def delete(
|
|
937
|
+
id \
|
|
938
|
+
,
|
|
939
|
+
deadline:nil)
|
|
940
|
+
req = V1::RoleAttachmentDeleteRequest.new()
|
|
941
|
+
|
|
942
|
+
req.id = id
|
|
943
|
+
tries = 0
|
|
944
|
+
plumbing_response = nil
|
|
945
|
+
loop do
|
|
946
|
+
begin
|
|
947
|
+
plumbing_response = @stub.delete(req, metadata: @parent.get_metadata('RoleAttachments.Delete', req), deadline:deadline)
|
|
948
|
+
rescue => exception
|
|
949
|
+
if (@parent.shouldRetry(tries, exception))
|
|
950
|
+
tries++
|
|
951
|
+
@parent.jitterSleep(tries)
|
|
952
|
+
next
|
|
953
|
+
end
|
|
954
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
955
|
+
end
|
|
956
|
+
break
|
|
957
|
+
end
|
|
958
|
+
|
|
959
|
+
|
|
960
|
+
resp = RoleAttachmentDeleteResponse.new()
|
|
961
|
+
resp.meta = Plumbing::delete_response_metadata_to_porcelain(plumbing_response.meta)
|
|
962
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
963
|
+
resp
|
|
964
|
+
end
|
|
965
|
+
# List gets a list of RoleAttachments matching a given set of criteria.
|
|
966
|
+
def list(
|
|
967
|
+
filter \
|
|
968
|
+
,
|
|
969
|
+
*args,
|
|
970
|
+
deadline:nil)
|
|
971
|
+
req = V1::RoleAttachmentListRequest.new()
|
|
972
|
+
req.meta = V1::ListRequestMetadata.new()
|
|
973
|
+
page_size_option = @parent._test_options['PageSize']
|
|
974
|
+
if page_size_option.is_a? Integer
|
|
975
|
+
req.meta.limit = page_size_option
|
|
976
|
+
end
|
|
977
|
+
|
|
978
|
+
req.filter = Plumbing::quote_filter_args(filter, *args)
|
|
979
|
+
resp = Enumerator::Generator.new { |g|
|
|
980
|
+
tries = 0
|
|
981
|
+
loop do
|
|
982
|
+
begin
|
|
983
|
+
plumbing_response = @stub.list(req, metadata: @parent.get_metadata('RoleAttachments.List', req), deadline:deadline)
|
|
984
|
+
rescue => exception
|
|
985
|
+
if (@parent.shouldRetry(tries, exception))
|
|
986
|
+
tries++
|
|
987
|
+
@parent.jitterSleep(tries)
|
|
988
|
+
next
|
|
989
|
+
end
|
|
990
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
991
|
+
end
|
|
992
|
+
tries = 0
|
|
993
|
+
plumbing_response.role_attachments.each do |plumbing_item|
|
|
994
|
+
g.yield Plumbing::role_attachment_to_porcelain(plumbing_item)
|
|
995
|
+
end
|
|
996
|
+
break if plumbing_response.meta.next_cursor == ""
|
|
997
|
+
req.meta.cursor = plumbing_response.meta.next_cursor
|
|
998
|
+
end
|
|
999
|
+
}
|
|
1000
|
+
resp
|
|
1001
|
+
end
|
|
1002
|
+
end
|
|
1003
|
+
# RoleGrants represent relationships between composite roles and the roles
|
|
1004
|
+
# that make up those composite roles. When a composite role is attached to another
|
|
1005
|
+
# role, the permissions granted to members of the composite role are augmented to
|
|
1006
|
+
# include the permissions granted to members of the attached role.
|
|
1007
|
+
class RoleGrants
|
|
1008
|
+
def initialize(host, insecure, parent)
|
|
1009
|
+
begin
|
|
1010
|
+
if insecure
|
|
1011
|
+
@stub = V1::RoleGrants::Stub.new(host, :this_channel_is_insecure)
|
|
1012
|
+
else
|
|
1013
|
+
cred = GRPC::Core::ChannelCredentials.new()
|
|
1014
|
+
@stub = V1::RoleGrants::Stub.new(host, cred)
|
|
1015
|
+
end
|
|
1016
|
+
rescue => exception
|
|
1017
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
1018
|
+
end
|
|
1019
|
+
@parent = parent
|
|
1020
|
+
end
|
|
1021
|
+
# Create registers a new RoleGrant.
|
|
1022
|
+
def create(
|
|
1023
|
+
role_grant \
|
|
1024
|
+
,
|
|
1025
|
+
deadline:nil)
|
|
1026
|
+
req = V1::RoleGrantCreateRequest.new()
|
|
1027
|
+
|
|
1028
|
+
req.role_grant = Plumbing::role_grant_to_plumbing(role_grant)
|
|
1029
|
+
tries = 0
|
|
1030
|
+
plumbing_response = nil
|
|
1031
|
+
loop do
|
|
1032
|
+
begin
|
|
1033
|
+
plumbing_response = @stub.create(req, metadata: @parent.get_metadata('RoleGrants.Create', req), deadline:deadline)
|
|
1034
|
+
rescue => exception
|
|
1035
|
+
if (@parent.shouldRetry(tries, exception))
|
|
1036
|
+
tries++
|
|
1037
|
+
@parent.jitterSleep(tries)
|
|
1038
|
+
next
|
|
1039
|
+
end
|
|
1040
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
1041
|
+
end
|
|
1042
|
+
break
|
|
1043
|
+
end
|
|
1044
|
+
|
|
1045
|
+
|
|
1046
|
+
resp = RoleGrantCreateResponse.new()
|
|
1047
|
+
resp.meta = Plumbing::create_response_metadata_to_porcelain(plumbing_response.meta)
|
|
1048
|
+
resp.role_grant = Plumbing::role_grant_to_porcelain(plumbing_response.role_grant)
|
|
1049
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
1050
|
+
resp
|
|
1051
|
+
end
|
|
1052
|
+
# Get reads one RoleGrant by ID.
|
|
1053
|
+
def get(
|
|
1054
|
+
id \
|
|
1055
|
+
,
|
|
1056
|
+
deadline:nil)
|
|
1057
|
+
req = V1::RoleGrantGetRequest.new()
|
|
1058
|
+
|
|
1059
|
+
req.id = id
|
|
1060
|
+
tries = 0
|
|
1061
|
+
plumbing_response = nil
|
|
1062
|
+
loop do
|
|
1063
|
+
begin
|
|
1064
|
+
plumbing_response = @stub.get(req, metadata: @parent.get_metadata('RoleGrants.Get', req), deadline:deadline)
|
|
1065
|
+
rescue => exception
|
|
1066
|
+
if (@parent.shouldRetry(tries, exception))
|
|
1067
|
+
tries++
|
|
1068
|
+
@parent.jitterSleep(tries)
|
|
1069
|
+
next
|
|
1070
|
+
end
|
|
1071
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
1072
|
+
end
|
|
1073
|
+
break
|
|
1074
|
+
end
|
|
1075
|
+
|
|
1076
|
+
|
|
1077
|
+
resp = RoleGrantGetResponse.new()
|
|
1078
|
+
resp.meta = Plumbing::get_response_metadata_to_porcelain(plumbing_response.meta)
|
|
1079
|
+
resp.role_grant = Plumbing::role_grant_to_porcelain(plumbing_response.role_grant)
|
|
1080
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
1081
|
+
resp
|
|
1082
|
+
end
|
|
1083
|
+
# Delete removes a RoleGrant by ID.
|
|
1084
|
+
def delete(
|
|
1085
|
+
id \
|
|
1086
|
+
,
|
|
1087
|
+
deadline:nil)
|
|
1088
|
+
req = V1::RoleGrantDeleteRequest.new()
|
|
1089
|
+
|
|
1090
|
+
req.id = id
|
|
1091
|
+
tries = 0
|
|
1092
|
+
plumbing_response = nil
|
|
1093
|
+
loop do
|
|
1094
|
+
begin
|
|
1095
|
+
plumbing_response = @stub.delete(req, metadata: @parent.get_metadata('RoleGrants.Delete', req), deadline:deadline)
|
|
1096
|
+
rescue => exception
|
|
1097
|
+
if (@parent.shouldRetry(tries, exception))
|
|
1098
|
+
tries++
|
|
1099
|
+
@parent.jitterSleep(tries)
|
|
1100
|
+
next
|
|
1101
|
+
end
|
|
1102
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
1103
|
+
end
|
|
1104
|
+
break
|
|
1105
|
+
end
|
|
1106
|
+
|
|
1107
|
+
|
|
1108
|
+
resp = RoleGrantDeleteResponse.new()
|
|
1109
|
+
resp.meta = Plumbing::delete_response_metadata_to_porcelain(plumbing_response.meta)
|
|
1110
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
1111
|
+
resp
|
|
1112
|
+
end
|
|
1113
|
+
# List gets a list of RoleGrants matching a given set of criteria.
|
|
1114
|
+
def list(
|
|
1115
|
+
filter \
|
|
1116
|
+
,
|
|
1117
|
+
*args,
|
|
1118
|
+
deadline:nil)
|
|
1119
|
+
req = V1::RoleGrantListRequest.new()
|
|
1120
|
+
req.meta = V1::ListRequestMetadata.new()
|
|
1121
|
+
page_size_option = @parent._test_options['PageSize']
|
|
1122
|
+
if page_size_option.is_a? Integer
|
|
1123
|
+
req.meta.limit = page_size_option
|
|
1124
|
+
end
|
|
1125
|
+
|
|
1126
|
+
req.filter = Plumbing::quote_filter_args(filter, *args)
|
|
1127
|
+
resp = Enumerator::Generator.new { |g|
|
|
1128
|
+
tries = 0
|
|
1129
|
+
loop do
|
|
1130
|
+
begin
|
|
1131
|
+
plumbing_response = @stub.list(req, metadata: @parent.get_metadata('RoleGrants.List', req), deadline:deadline)
|
|
1132
|
+
rescue => exception
|
|
1133
|
+
if (@parent.shouldRetry(tries, exception))
|
|
1134
|
+
tries++
|
|
1135
|
+
@parent.jitterSleep(tries)
|
|
1136
|
+
next
|
|
1137
|
+
end
|
|
1138
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
1139
|
+
end
|
|
1140
|
+
tries = 0
|
|
1141
|
+
plumbing_response.role_grants.each do |plumbing_item|
|
|
1142
|
+
g.yield Plumbing::role_grant_to_porcelain(plumbing_item)
|
|
1143
|
+
end
|
|
1144
|
+
break if plumbing_response.meta.next_cursor == ""
|
|
1145
|
+
req.meta.cursor = plumbing_response.meta.next_cursor
|
|
1146
|
+
end
|
|
1147
|
+
}
|
|
1148
|
+
resp
|
|
1149
|
+
end
|
|
1150
|
+
end
|
|
1151
|
+
# Roles are tools for controlling user access to resources. Each Role holds a
|
|
1152
|
+
# list of resources which they grant access to. Composite roles are a special
|
|
1153
|
+
# type of Role which have no resource associations of their own, but instead
|
|
1154
|
+
# grant access to the combined resources associated with a set of child roles.
|
|
1155
|
+
# Each user can be a member of one Role or composite role.
|
|
1156
|
+
class Roles
|
|
1157
|
+
def initialize(host, insecure, parent)
|
|
1158
|
+
begin
|
|
1159
|
+
if insecure
|
|
1160
|
+
@stub = V1::Roles::Stub.new(host, :this_channel_is_insecure)
|
|
1161
|
+
else
|
|
1162
|
+
cred = GRPC::Core::ChannelCredentials.new()
|
|
1163
|
+
@stub = V1::Roles::Stub.new(host, cred)
|
|
1164
|
+
end
|
|
1165
|
+
rescue => exception
|
|
1166
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
1167
|
+
end
|
|
1168
|
+
@parent = parent
|
|
1169
|
+
end
|
|
1170
|
+
# Create registers a new Role.
|
|
1171
|
+
def create(
|
|
1172
|
+
role \
|
|
1173
|
+
,
|
|
1174
|
+
deadline:nil)
|
|
1175
|
+
req = V1::RoleCreateRequest.new()
|
|
1176
|
+
|
|
1177
|
+
req.role = Plumbing::role_to_plumbing(role)
|
|
1178
|
+
tries = 0
|
|
1179
|
+
plumbing_response = nil
|
|
1180
|
+
loop do
|
|
1181
|
+
begin
|
|
1182
|
+
plumbing_response = @stub.create(req, metadata: @parent.get_metadata('Roles.Create', req), deadline:deadline)
|
|
1183
|
+
rescue => exception
|
|
1184
|
+
if (@parent.shouldRetry(tries, exception))
|
|
1185
|
+
tries++
|
|
1186
|
+
@parent.jitterSleep(tries)
|
|
1187
|
+
next
|
|
1188
|
+
end
|
|
1189
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
1190
|
+
end
|
|
1191
|
+
break
|
|
1192
|
+
end
|
|
1193
|
+
|
|
1194
|
+
|
|
1195
|
+
resp = RoleCreateResponse.new()
|
|
1196
|
+
resp.meta = Plumbing::create_response_metadata_to_porcelain(plumbing_response.meta)
|
|
1197
|
+
resp.role = Plumbing::role_to_porcelain(plumbing_response.role)
|
|
1198
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
1199
|
+
resp
|
|
1200
|
+
end
|
|
1201
|
+
# Get reads one Role by ID.
|
|
1202
|
+
def get(
|
|
1203
|
+
id \
|
|
1204
|
+
,
|
|
1205
|
+
deadline:nil)
|
|
1206
|
+
req = V1::RoleGetRequest.new()
|
|
1207
|
+
|
|
1208
|
+
req.id = id
|
|
1209
|
+
tries = 0
|
|
1210
|
+
plumbing_response = nil
|
|
1211
|
+
loop do
|
|
1212
|
+
begin
|
|
1213
|
+
plumbing_response = @stub.get(req, metadata: @parent.get_metadata('Roles.Get', req), deadline:deadline)
|
|
1214
|
+
rescue => exception
|
|
1215
|
+
if (@parent.shouldRetry(tries, exception))
|
|
1216
|
+
tries++
|
|
1217
|
+
@parent.jitterSleep(tries)
|
|
1218
|
+
next
|
|
1219
|
+
end
|
|
1220
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
1221
|
+
end
|
|
1222
|
+
break
|
|
1223
|
+
end
|
|
1224
|
+
|
|
1225
|
+
|
|
1226
|
+
resp = RoleGetResponse.new()
|
|
1227
|
+
resp.meta = Plumbing::get_response_metadata_to_porcelain(plumbing_response.meta)
|
|
1228
|
+
resp.role = Plumbing::role_to_porcelain(plumbing_response.role)
|
|
1229
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
1230
|
+
resp
|
|
1231
|
+
end
|
|
1232
|
+
# Update patches a Role by ID.
|
|
1233
|
+
def update(
|
|
1234
|
+
role \
|
|
1235
|
+
,
|
|
1236
|
+
deadline:nil)
|
|
1237
|
+
req = V1::RoleUpdateRequest.new()
|
|
1238
|
+
|
|
1239
|
+
req.role = Plumbing::role_to_plumbing(role)
|
|
1240
|
+
tries = 0
|
|
1241
|
+
plumbing_response = nil
|
|
1242
|
+
loop do
|
|
1243
|
+
begin
|
|
1244
|
+
plumbing_response = @stub.update(req, metadata: @parent.get_metadata('Roles.Update', req), deadline:deadline)
|
|
1245
|
+
rescue => exception
|
|
1246
|
+
if (@parent.shouldRetry(tries, exception))
|
|
1247
|
+
tries++
|
|
1248
|
+
@parent.jitterSleep(tries)
|
|
1249
|
+
next
|
|
1250
|
+
end
|
|
1251
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
1252
|
+
end
|
|
1253
|
+
break
|
|
1254
|
+
end
|
|
1255
|
+
|
|
1256
|
+
|
|
1257
|
+
resp = RoleUpdateResponse.new()
|
|
1258
|
+
resp.meta = Plumbing::update_response_metadata_to_porcelain(plumbing_response.meta)
|
|
1259
|
+
resp.role = Plumbing::role_to_porcelain(plumbing_response.role)
|
|
1260
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
1261
|
+
resp
|
|
1262
|
+
end
|
|
1263
|
+
# Delete removes a Role by ID.
|
|
1264
|
+
def delete(
|
|
1265
|
+
id \
|
|
1266
|
+
,
|
|
1267
|
+
deadline:nil)
|
|
1268
|
+
req = V1::RoleDeleteRequest.new()
|
|
1269
|
+
|
|
1270
|
+
req.id = id
|
|
1271
|
+
tries = 0
|
|
1272
|
+
plumbing_response = nil
|
|
1273
|
+
loop do
|
|
1274
|
+
begin
|
|
1275
|
+
plumbing_response = @stub.delete(req, metadata: @parent.get_metadata('Roles.Delete', req), deadline:deadline)
|
|
1276
|
+
rescue => exception
|
|
1277
|
+
if (@parent.shouldRetry(tries, exception))
|
|
1278
|
+
tries++
|
|
1279
|
+
@parent.jitterSleep(tries)
|
|
1280
|
+
next
|
|
1281
|
+
end
|
|
1282
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
1283
|
+
end
|
|
1284
|
+
break
|
|
1285
|
+
end
|
|
1286
|
+
|
|
1287
|
+
|
|
1288
|
+
resp = RoleDeleteResponse.new()
|
|
1289
|
+
resp.meta = Plumbing::delete_response_metadata_to_porcelain(plumbing_response.meta)
|
|
1290
|
+
resp.rate_limit = Plumbing::rate_limit_metadata_to_porcelain(plumbing_response.rate_limit)
|
|
1291
|
+
resp
|
|
1292
|
+
end
|
|
1293
|
+
# List gets a list of Roles matching a given set of criteria.
|
|
1294
|
+
def list(
|
|
1295
|
+
filter \
|
|
1296
|
+
,
|
|
1297
|
+
*args,
|
|
1298
|
+
deadline:nil)
|
|
1299
|
+
req = V1::RoleListRequest.new()
|
|
1300
|
+
req.meta = V1::ListRequestMetadata.new()
|
|
1301
|
+
page_size_option = @parent._test_options['PageSize']
|
|
1302
|
+
if page_size_option.is_a? Integer
|
|
1303
|
+
req.meta.limit = page_size_option
|
|
1304
|
+
end
|
|
1305
|
+
|
|
1306
|
+
req.filter = Plumbing::quote_filter_args(filter, *args)
|
|
1307
|
+
resp = Enumerator::Generator.new { |g|
|
|
1308
|
+
tries = 0
|
|
1309
|
+
loop do
|
|
1310
|
+
begin
|
|
1311
|
+
plumbing_response = @stub.list(req, metadata: @parent.get_metadata('Roles.List', req), deadline:deadline)
|
|
1312
|
+
rescue => exception
|
|
1313
|
+
if (@parent.shouldRetry(tries, exception))
|
|
1314
|
+
tries++
|
|
1315
|
+
@parent.jitterSleep(tries)
|
|
1316
|
+
next
|
|
1317
|
+
end
|
|
1318
|
+
raise Plumbing::error_to_porcelain(exception)
|
|
1319
|
+
end
|
|
1320
|
+
tries = 0
|
|
1321
|
+
plumbing_response.roles.each do |plumbing_item|
|
|
1322
|
+
g.yield Plumbing::role_to_porcelain(plumbing_item)
|
|
1323
|
+
end
|
|
1324
|
+
break if plumbing_response.meta.next_cursor == ""
|
|
1325
|
+
req.meta.cursor = plumbing_response.meta.next_cursor
|
|
1326
|
+
end
|
|
1327
|
+
}
|
|
1328
|
+
resp
|
|
1329
|
+
end
|
|
1330
|
+
end
|
|
1331
|
+
end
|