strongdm 1.0.5 → 1.0.7

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.
Files changed (110) hide show
  1. checksums.yaml +4 -4
  2. data/doc/Object.html +324 -1
  3. data/doc/SDM/AKS.html +2 -2
  4. data/doc/SDM/AKSBasicAuth.html +2 -2
  5. data/doc/SDM/AKSServiceAccount.html +2 -2
  6. data/doc/SDM/AccountAttachment.html +2 -2
  7. data/doc/SDM/AccountAttachmentCreateResponse.html +2 -2
  8. data/doc/SDM/AccountAttachmentDeleteResponse.html +2 -2
  9. data/doc/SDM/AccountAttachmentGetResponse.html +2 -2
  10. data/doc/SDM/AccountAttachments.html +4 -6
  11. data/doc/SDM/AccountCreateResponse.html +2 -2
  12. data/doc/SDM/AccountDeleteResponse.html +2 -2
  13. data/doc/SDM/AccountGetResponse.html +2 -2
  14. data/doc/SDM/AccountGrant.html +2 -2
  15. data/doc/SDM/AccountGrantCreateResponse.html +2 -2
  16. data/doc/SDM/AccountGrantDeleteResponse.html +2 -2
  17. data/doc/SDM/AccountGrantGetResponse.html +2 -2
  18. data/doc/SDM/AccountGrants.html +5 -5
  19. data/doc/SDM/AccountUpdateResponse.html +2 -2
  20. data/doc/SDM/Accounts.html +6 -6
  21. data/doc/SDM/AmazonEKS.html +2 -2
  22. data/doc/SDM/AmazonES.html +2 -2
  23. data/doc/SDM/Athena.html +2 -2
  24. data/doc/SDM/AuroraMysql.html +2 -2
  25. data/doc/SDM/AuroraPostgres.html +2 -2
  26. data/doc/SDM/BigQuery.html +2 -2
  27. data/doc/SDM/Cassandra.html +2 -2
  28. data/doc/SDM/Citus.html +2 -2
  29. data/doc/SDM/Clustrix.html +2 -2
  30. data/doc/SDM/Cockroach.html +2 -2
  31. data/doc/SDM/DB2.html +2 -2
  32. data/doc/SDM/Druid.html +2 -2
  33. data/doc/SDM/DynamoDB.html +2 -2
  34. data/doc/SDM/Elastic.html +2 -2
  35. data/doc/SDM/ElasticacheRedis.html +2 -2
  36. data/doc/SDM/Gateway.html +2 -2
  37. data/doc/SDM/GoogleGKE.html +2 -2
  38. data/doc/SDM/Greenplum.html +2 -2
  39. data/doc/SDM/HTTPAuth.html +2 -2
  40. data/doc/SDM/HTTPBasicAuth.html +2 -2
  41. data/doc/SDM/HTTPNoAuth.html +2 -2
  42. data/doc/SDM/Kubernetes.html +2 -2
  43. data/doc/SDM/KubernetesBasicAuth.html +2 -2
  44. data/doc/SDM/KubernetesServiceAccount.html +2 -2
  45. data/doc/SDM/Maria.html +2 -2
  46. data/doc/SDM/Memcached.html +2 -2
  47. data/doc/SDM/Memsql.html +2 -2
  48. data/doc/SDM/MongoHost.html +2 -2
  49. data/doc/SDM/MongoLegacyHost.html +2 -2
  50. data/doc/SDM/MongoLegacyReplicaset.html +2 -2
  51. data/doc/SDM/MongoReplicaSet.html +2 -2
  52. data/doc/SDM/Mysql.html +2 -2
  53. data/doc/SDM/NodeCreateResponse.html +2 -2
  54. data/doc/SDM/NodeDeleteResponse.html +2 -2
  55. data/doc/SDM/NodeGetResponse.html +2 -2
  56. data/doc/SDM/NodeUpdateResponse.html +2 -2
  57. data/doc/SDM/Nodes.html +6 -6
  58. data/doc/SDM/Oracle.html +2 -2
  59. data/doc/SDM/Plumbing.html +349 -509
  60. data/doc/SDM/Postgres.html +2 -2
  61. data/doc/SDM/Presto.html +2 -2
  62. data/doc/SDM/RDP.html +2 -2
  63. data/doc/SDM/Redis.html +2 -2
  64. data/doc/SDM/Redshift.html +2 -2
  65. data/doc/SDM/Relay.html +2 -2
  66. data/doc/SDM/ResourceCreateResponse.html +2 -2
  67. data/doc/SDM/ResourceDeleteResponse.html +2 -2
  68. data/doc/SDM/ResourceGetResponse.html +2 -2
  69. data/doc/SDM/ResourceUpdateResponse.html +2 -2
  70. data/doc/SDM/Resources.html +6 -6
  71. data/doc/SDM/Role.html +2 -2
  72. data/doc/SDM/RoleAttachment.html +2 -2
  73. data/doc/SDM/RoleAttachmentCreateResponse.html +2 -2
  74. data/doc/SDM/RoleAttachmentDeleteResponse.html +2 -2
  75. data/doc/SDM/RoleAttachmentGetResponse.html +2 -2
  76. data/doc/SDM/RoleAttachments.html +5 -5
  77. data/doc/SDM/RoleCreateResponse.html +2 -2
  78. data/doc/SDM/RoleDeleteResponse.html +2 -2
  79. data/doc/SDM/RoleGetResponse.html +2 -2
  80. data/doc/SDM/RoleGrant.html +2 -2
  81. data/doc/SDM/RoleGrantCreateResponse.html +2 -2
  82. data/doc/SDM/RoleGrantDeleteResponse.html +2 -2
  83. data/doc/SDM/RoleGrantGetResponse.html +2 -2
  84. data/doc/SDM/RoleGrants.html +5 -5
  85. data/doc/SDM/RoleUpdateResponse.html +2 -2
  86. data/doc/SDM/Roles.html +6 -6
  87. data/doc/SDM/SQLServer.html +2 -2
  88. data/doc/SDM/SSH.html +2 -2
  89. data/doc/SDM/SSHCert.html +2 -2
  90. data/doc/SDM/Service.html +2 -2
  91. data/doc/SDM/Snowflake.html +2 -2
  92. data/doc/SDM/Sybase.html +2 -2
  93. data/doc/SDM/SybaseIQ.html +2 -2
  94. data/doc/SDM/Teradata.html +2 -2
  95. data/doc/SDM/User.html +2 -2
  96. data/doc/V1.html +0 -5
  97. data/doc/created.rid +38 -36
  98. data/doc/index.html +0 -2
  99. data/doc/js/search_index.js +1 -1
  100. data/doc/js/search_index.js.gz +0 -0
  101. data/doc/lib/version.html +1 -1
  102. data/doc/table_of_contents.html +118 -143
  103. data/examples/ldap-sync/ldapSync.rb +290 -0
  104. data/lib/grpc/account_attachments_pb.rb +0 -5
  105. data/lib/grpc/plumbing.rb +0 -34
  106. data/lib/models/porcelain.rb +0 -23
  107. data/lib/svc.rb +0 -2
  108. data/lib/version +1 -1
  109. data/lib/version.rb +1 -1
  110. metadata +17 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3b64f5fd1fc1ef6d85097b9ca10acd1c320736ac630b8fe2eb2207569c012b0b
4
- data.tar.gz: f3690a2bb93835e1d5fb97a11c11f470215a4bba0df4f36698094b5e49a1383f
3
+ metadata.gz: 86cc4d6b9580c2ea725286eaf30a140a051f8b035f50a3728b16dd90eb777ff0
4
+ data.tar.gz: 06c32258d35b6952710addf5cfd4566f99b632d1f989e85264cbffa5fcfa63d2
5
5
  SHA512:
6
- metadata.gz: 53c96b0ac8c70da8248bf7172c0dd1bab7f1f8ec2b6bf98aef88bcef4e584845da86ef52bdec527a49a3b878ce41827a47a7322f5b72f8b830dd81f81c787a52
7
- data.tar.gz: 8f9ab42f9f4a8702c0fda215c804be097ab825813b94e0974523adbe76b8769ed5e3a130d767d0380d89be47421c79cf0d75ce14466d6cc51560c164e18d447d
6
+ metadata.gz: 98e2c20ee4168b3948210c0d0313ba20f25e4055e81210aac9cda3c2974669c514dd2d6830b581e62e2f2d826802409ef316cdd94f9bd6bb8cd537a7db72f281
7
+ data.tar.gz: bc46ed7ffed5c9ea0b993631f62c52e1d1577a3c52b8b28455dbef97a9d7ac2d8e5e4c492397852dee580d5c3b9e3388cc2a053a7308b66e77fcca34bb25ab61
@@ -75,6 +75,10 @@
75
75
 
76
76
  <ul class="link-list" role="directory">
77
77
 
78
+ <li ><a href="#method-i-first">#first</a>
79
+
80
+ <li ><a href="#method-i-ldap_sync">#ldap_sync</a>
81
+
78
82
  <li ><a href="#method-i-main">#main</a>
79
83
 
80
84
  <li ><a href="#method-i-okta_sync">#okta_sync</a>
@@ -122,6 +126,21 @@
122
126
  <dd>
123
127
 
124
128
 
129
+ <dt id="LDAP_BIND_DN">LDAP_BIND_DN
130
+
131
+ <dd>
132
+
133
+
134
+ <dt id="LDAP_HOST">LDAP_HOST
135
+
136
+ <dd>
137
+
138
+
139
+ <dt id="LDAP_PASSWORD">LDAP_PASSWORD
140
+
141
+ <dd>
142
+
143
+
125
144
  <dt id="OKTA_CLIENT_ORGURL">OKTA_CLIENT_ORGURL
126
145
 
127
146
  <dd>
@@ -134,7 +153,21 @@
134
153
 
135
154
  <dt id="SDM_API_ACCESS_KEY">SDM_API_ACCESS_KEY
136
155
 
137
- <dd>
156
+ <dd><p>organizationalUnits:</p>
157
+
158
+ <pre>- dn: OU=Other-OU,DC=j42,DC=xyz
159
+ role: Other-OU
160
+ resources:
161
+ - name:*Other-OU*
162
+ - name:*Multi*
163
+ - dn: OU=admins,DC=j42,DC=xyz
164
+ role: admins
165
+ resources:
166
+ - name:*admins*
167
+ - dn: OU=People,DC=j42,DC=xyz
168
+ role: People
169
+ resources:
170
+ - name:*People*</pre>
138
171
 
139
172
 
140
173
  <dt id="SDM_API_SECRET_KEY">SDM_API_SECRET_KEY
@@ -155,6 +188,296 @@
155
188
  </header>
156
189
 
157
190
 
191
+ <div id="method-i-first" class="method-detail ">
192
+
193
+ <div class="method-heading">
194
+ <span class="method-name">first</span><span
195
+ class="method-args">(attrib)</span>
196
+
197
+ <span class="method-click-advice">click to toggle source</span>
198
+
199
+ </div>
200
+
201
+
202
+ <div class="method-description">
203
+
204
+ <p>gets the first item in a list or generator</p>
205
+
206
+
207
+
208
+
209
+ <div class="method-source-code" id="first-source">
210
+ <pre><span class="ruby-comment"># File examples/ldap-sync/ldapSync.rb, line 58</span>
211
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">first</span>(<span class="ruby-identifier">attrib</span>)
212
+ <span class="ruby-identifier">result</span> = <span class="ruby-keyword">nil</span>
213
+ <span class="ruby-identifier">attrib</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">item</span><span class="ruby-operator">|</span>
214
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">result</span> <span class="ruby-operator">==</span> <span class="ruby-keyword">nil</span>
215
+ <span class="ruby-identifier">result</span> = <span class="ruby-identifier">item</span>
216
+ <span class="ruby-keyword">end</span>
217
+ <span class="ruby-keyword">end</span>
218
+ <span class="ruby-identifier">result</span>
219
+ <span class="ruby-keyword">end</span></pre>
220
+ </div>
221
+
222
+ </div>
223
+
224
+
225
+
226
+
227
+ </div>
228
+
229
+
230
+ <div id="method-i-ldap_sync" class="method-detail ">
231
+
232
+ <div class="method-heading">
233
+ <span class="method-name">ldap_sync</span><span
234
+ class="method-args">()</span>
235
+
236
+ <span class="method-click-advice">click to toggle source</span>
237
+
238
+ </div>
239
+
240
+
241
+ <div class="method-description">
242
+
243
+
244
+
245
+
246
+
247
+
248
+ <div class="method-source-code" id="ldap_sync-source">
249
+ <pre><span class="ruby-comment"># File examples/ldap-sync/ldapSync.rb, line 68</span>
250
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">ldap_sync</span>
251
+ <span class="ruby-keyword">if</span> <span class="ruby-constant">SDM_API_ACCESS_KEY</span> <span class="ruby-operator">==</span> <span class="ruby-string">&#39;&#39;</span> <span class="ruby-operator">||</span> <span class="ruby-constant">SDM_API_SECRET_KEY</span> <span class="ruby-operator">==</span> <span class="ruby-string">&#39;&#39;</span> <span class="ruby-operator">||</span> <span class="ruby-constant">LDAP_BIND_DN</span> <span class="ruby-operator">==</span> <span class="ruby-string">&#39;&#39;</span>
252
+ <span class="ruby-identifier">puts</span> <span class="ruby-string">&#39;SDM_API_ACCESS_KEY, SDM_API_SECRET_KEY, and LDAP_BIND_DN must be set&#39;</span>
253
+ <span class="ruby-identifier">exit</span> <span class="ruby-value">1</span>
254
+ <span class="ruby-keyword">end</span>
255
+
256
+ <span class="ruby-identifier">plan</span> = <span class="ruby-keyword">false</span>
257
+ <span class="ruby-identifier">verbose</span> = <span class="ruby-keyword">false</span>
258
+ <span class="ruby-identifier">configPath</span> = <span class="ruby-string">&#39;config.yml&#39;</span>
259
+ <span class="ruby-constant">OptionParser</span>.<span class="ruby-identifier">new</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">opts</span><span class="ruby-operator">|</span>
260
+ <span class="ruby-identifier">opts</span>.<span class="ruby-identifier">banner</span> = <span class="ruby-string">&quot;Usage ldapSync.rb [options]&quot;</span>
261
+ <span class="ruby-identifier">opts</span>.<span class="ruby-identifier">on</span>(<span class="ruby-string">&quot;-p&quot;</span>, <span class="ruby-string">&quot;--plan&quot;</span>, <span class="ruby-string">&quot;calculate changes but do not apply them&quot;</span>) <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">p</span><span class="ruby-operator">|</span>
262
+ <span class="ruby-identifier">plan</span> = <span class="ruby-identifier">p</span>
263
+ <span class="ruby-keyword">end</span>
264
+ <span class="ruby-identifier">opts</span>.<span class="ruby-identifier">on</span>(<span class="ruby-string">&quot;-v&quot;</span>, <span class="ruby-string">&quot;--verbose&quot;</span>, <span class="ruby-string">&quot;print detailed report&quot;</span>) <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">v</span><span class="ruby-operator">|</span>
265
+ <span class="ruby-identifier">verbose</span> = <span class="ruby-identifier">v</span>
266
+ <span class="ruby-keyword">end</span>
267
+ <span class="ruby-identifier">opts</span>.<span class="ruby-identifier">on</span>(<span class="ruby-string">&quot;-c&quot;</span>, <span class="ruby-string">&quot;--config FILE&quot;</span>, <span class="ruby-string">&quot;specify path to config YAML file (default: &#39;config.yml&#39;)&quot;</span>) <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">v</span><span class="ruby-operator">|</span>
268
+ <span class="ruby-identifier">configPath</span> = <span class="ruby-identifier">v</span>
269
+ <span class="ruby-keyword">end</span>
270
+ <span class="ruby-keyword">end</span>.<span class="ruby-identifier">parse!</span>
271
+
272
+ <span class="ruby-keyword">begin</span>
273
+ <span class="ruby-identifier">config</span> = <span class="ruby-constant">YAML</span>.<span class="ruby-identifier">load</span>(<span class="ruby-constant">File</span>.<span class="ruby-identifier">read</span>(<span class="ruby-identifier">configPath</span>))
274
+ <span class="ruby-keyword">rescue</span> <span class="ruby-constant">StandardError</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">ex</span>
275
+ <span class="ruby-identifier">raise</span> <span class="ruby-identifier">ex</span>, <span class="ruby-node">&quot;failed to parse #{configPath}&quot;</span>
276
+ <span class="ruby-keyword">end</span>
277
+
278
+ <span class="ruby-keyword">begin</span>
279
+ <span class="ruby-identifier">sdmClient</span> = <span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">Client</span>.<span class="ruby-identifier">new</span>(<span class="ruby-constant">SDM_API_ACCESS_KEY</span>, <span class="ruby-constant">SDM_API_SECRET_KEY</span>, <span class="ruby-value">host:</span> <span class="ruby-string">&#39;api.strongdmdev.com:443&#39;</span>)
280
+ <span class="ruby-keyword">rescue</span> <span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">RPCError</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">ex</span>
281
+ <span class="ruby-identifier">raise</span> <span class="ruby-identifier">ex</span>, <span class="ruby-string">&#39;failed to create StrongDM client&#39;</span>
282
+ <span class="ruby-keyword">end</span>
283
+
284
+ <span class="ruby-identifier">ldap</span> = <span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">LDAP</span>.<span class="ruby-identifier">new</span>
285
+ <span class="ruby-identifier">ldap</span>.<span class="ruby-identifier">host</span> = <span class="ruby-constant">LDAP_HOST</span>
286
+ <span class="ruby-identifier">ldap</span>.<span class="ruby-identifier">auth</span> <span class="ruby-constant">LDAP_BIND_DN</span>, <span class="ruby-constant">LDAP_PASSWORD</span>
287
+ <span class="ruby-keyword">if</span> <span class="ruby-keyword">not</span> <span class="ruby-identifier">ldap</span>.<span class="ruby-identifier">bind</span>
288
+ <span class="ruby-identifier">puts</span> <span class="ruby-string">&#39;failed to bind LDAP connection - authentication error&#39;</span>
289
+ <span class="ruby-identifier">exit</span> <span class="ruby-value">1</span>
290
+ <span class="ruby-keyword">end</span>
291
+
292
+ <span class="ruby-identifier">sdmRoles</span> = { } <span class="ruby-comment"># map of name to ID</span>
293
+ <span class="ruby-identifier">sdmAccounts</span> = { } <span class="ruby-comment"># map of email to id</span>
294
+ <span class="ruby-identifier">sdmResources</span> = { } <span class="ruby-comment"># map of ID to name</span>
295
+ <span class="ruby-identifier">sdmAccountsById</span> = { } <span class="ruby-comment"># map of id to { :email, :firstName, :lastName }</span>
296
+ <span class="ruby-identifier">sdmAccountsWithAttachments</span> = { } <span class="ruby-comment"># map of email to id of all accounts that are in the roles we&#39;re interested in</span>
297
+ <span class="ruby-identifier">sdmAccountAttachments</span> = { } <span class="ruby-comment"># map of role name to list of emails</span>
298
+ <span class="ruby-identifier">sdmRoleGrants</span> = { } <span class="ruby-comment"># map of role name to list of { :resourceId, :grantId }</span>
299
+ <span class="ruby-identifier">ldapRoles</span> = [] <span class="ruby-comment"># list of names</span>
300
+ <span class="ruby-identifier">ldapAccounts</span> = { } <span class="ruby-comment"># map of email to { :firstName, :lastName }</span>
301
+ <span class="ruby-identifier">ldapAccountAttachments</span> = { } <span class="ruby-comment"># map of role name to list of emails</span>
302
+ <span class="ruby-identifier">desiredRoleGrants</span> = { } <span class="ruby-comment"># map of role name to list of resource IDs</span>
303
+
304
+ <span class="ruby-comment"># get SDM accounts</span>
305
+ <span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">accounts</span>.<span class="ruby-identifier">list</span>(<span class="ruby-string">&#39;&#39;</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">account</span><span class="ruby-operator">|</span>
306
+ <span class="ruby-identifier">sdmAccounts</span>[<span class="ruby-identifier">account</span>.<span class="ruby-identifier">email</span>] = <span class="ruby-identifier">account</span>.<span class="ruby-identifier">id</span>
307
+ <span class="ruby-identifier">sdmAccountsById</span>[<span class="ruby-identifier">account</span>.<span class="ruby-identifier">id</span>] = { <span class="ruby-value">:email</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">account</span>.<span class="ruby-identifier">email</span>, <span class="ruby-value">:firstName</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">account</span>.<span class="ruby-identifier">first_name</span>, <span class="ruby-value">:lastName</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">account</span>.<span class="ruby-identifier">last_name</span> }
308
+ <span class="ruby-keyword">end</span>
309
+
310
+ <span class="ruby-comment"># get SDM resources</span>
311
+ <span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">resources</span>.<span class="ruby-identifier">list</span>(<span class="ruby-string">&#39;&#39;</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resource</span><span class="ruby-operator">|</span>
312
+ <span class="ruby-identifier">sdmResources</span>[<span class="ruby-identifier">resource</span>.<span class="ruby-identifier">id</span>] = <span class="ruby-identifier">resource</span>.<span class="ruby-identifier">name</span>
313
+ <span class="ruby-keyword">end</span>
314
+
315
+ <span class="ruby-comment"># loop through OUs</span>
316
+ <span class="ruby-identifier">config</span>[<span class="ruby-string">&#39;organizationalUnits&#39;</span>].<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">ou</span><span class="ruby-operator">|</span>
317
+
318
+ <span class="ruby-comment"># get SDM state for this OU</span>
319
+ <span class="ruby-identifier">role</span> = <span class="ruby-identifier">first</span>(<span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">roles</span>.<span class="ruby-identifier">list</span>(<span class="ruby-string">&#39;name:?&#39;</span>, <span class="ruby-identifier">ou</span>[<span class="ruby-string">&#39;role&#39;</span>]))
320
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">role</span>
321
+ <span class="ruby-identifier">sdmRoles</span>[<span class="ruby-identifier">role</span>.<span class="ruby-identifier">name</span>] = <span class="ruby-identifier">role</span>.<span class="ruby-identifier">id</span>
322
+
323
+ <span class="ruby-comment"># get accounts attached to this role</span>
324
+ <span class="ruby-identifier">accountEmails</span> = []
325
+ <span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">account_attachments</span>.<span class="ruby-identifier">list</span>(<span class="ruby-string">&#39;roleid:?&#39;</span>, <span class="ruby-identifier">role</span>.<span class="ruby-identifier">id</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">attachment</span><span class="ruby-operator">|</span>
326
+ <span class="ruby-identifier">sdmAccount</span> = <span class="ruby-identifier">sdmAccountsById</span>[<span class="ruby-identifier">attachment</span>.<span class="ruby-identifier">account_id</span>]
327
+ <span class="ruby-identifier">email</span> = <span class="ruby-identifier">sdmAccount</span>[<span class="ruby-value">:email</span>]
328
+ <span class="ruby-identifier">sdmAccountsWithAttachments</span>[<span class="ruby-identifier">email</span>] = <span class="ruby-identifier">attachment</span>.<span class="ruby-identifier">account_id</span>
329
+ <span class="ruby-identifier">accountEmails</span>.<span class="ruby-identifier">push</span>(<span class="ruby-identifier">email</span>)
330
+ <span class="ruby-keyword">end</span>
331
+ <span class="ruby-identifier">sdmAccountAttachments</span>[<span class="ruby-identifier">role</span>.<span class="ruby-identifier">name</span>] = <span class="ruby-identifier">accountEmails</span>
332
+
333
+ <span class="ruby-comment"># get resources granted to this role</span>
334
+ <span class="ruby-identifier">roleGrants</span> = []
335
+ <span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">role_grants</span>.<span class="ruby-identifier">list</span>(<span class="ruby-string">&#39;roleid:?&#39;</span>, <span class="ruby-identifier">role</span>.<span class="ruby-identifier">id</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">grant</span><span class="ruby-operator">|</span>
336
+ <span class="ruby-identifier">roleGrants</span>.<span class="ruby-identifier">push</span>({ <span class="ruby-value">:resourceId</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">grant</span>.<span class="ruby-identifier">resource_id</span>, <span class="ruby-value">:grantId</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">grant</span>.<span class="ruby-identifier">id</span> })
337
+ <span class="ruby-keyword">end</span>
338
+ <span class="ruby-identifier">sdmRoleGrants</span>[<span class="ruby-identifier">role</span>.<span class="ruby-identifier">name</span>] = <span class="ruby-identifier">roleGrants</span>
339
+
340
+ <span class="ruby-comment"># get resources that we want to grant to this role</span>
341
+ <span class="ruby-identifier">filteredResources</span> = { } <span class="ruby-comment"># map of resource ID to true (to prevent duplicates)</span>
342
+ <span class="ruby-identifier">filters</span> = <span class="ruby-identifier">ou</span>[<span class="ruby-string">&#39;resources&#39;</span>] <span class="ruby-comment"># list of filter strings</span>
343
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">filters</span>
344
+ <span class="ruby-identifier">filters</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">filter</span><span class="ruby-operator">|</span>
345
+ <span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">resources</span>.<span class="ruby-identifier">list</span>(<span class="ruby-identifier">filter</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resource</span><span class="ruby-operator">|</span>
346
+ <span class="ruby-identifier">filteredResources</span>[<span class="ruby-identifier">resource</span>.<span class="ruby-identifier">id</span>] = <span class="ruby-keyword">true</span>
347
+ <span class="ruby-keyword">end</span>
348
+ <span class="ruby-keyword">end</span>
349
+ <span class="ruby-identifier">desiredRoleGrants</span>[<span class="ruby-identifier">role</span>.<span class="ruby-identifier">name</span>] = <span class="ruby-identifier">filteredResources</span>.<span class="ruby-identifier">keys</span>
350
+ <span class="ruby-keyword">end</span>
351
+ <span class="ruby-keyword">end</span>
352
+
353
+ <span class="ruby-comment"># get LDAP state for this OU</span>
354
+ <span class="ruby-identifier">ldapRoles</span>.<span class="ruby-identifier">push</span>(<span class="ruby-identifier">ou</span>[<span class="ruby-string">&#39;role&#39;</span>].<span class="ruby-identifier">to_s</span>)
355
+ <span class="ruby-identifier">roleAccounts</span> = []
356
+ <span class="ruby-identifier">ldap</span>.<span class="ruby-identifier">search</span>(<span class="ruby-value">:base</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">ou</span>[<span class="ruby-string">&#39;dn&#39;</span>], <span class="ruby-value">:filter</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">LDAP</span><span class="ruby-operator">::</span><span class="ruby-constant">Filter</span>.<span class="ruby-identifier">eq</span>(<span class="ruby-string">&#39;objectclass&#39;</span>, <span class="ruby-string">&#39;user&#39;</span>), <span class="ruby-value">:return_result</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-keyword">false</span>) <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">entry</span><span class="ruby-operator">|</span>
357
+ <span class="ruby-identifier">ldapAccounts</span>[<span class="ruby-identifier">first</span>(<span class="ruby-identifier">entry</span>.<span class="ruby-identifier">mail</span>).<span class="ruby-identifier">to_s</span>] = {
358
+ <span class="ruby-value">:firstName</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">first</span>(<span class="ruby-identifier">entry</span>.<span class="ruby-identifier">givenname</span>).<span class="ruby-identifier">to_s</span>,
359
+ <span class="ruby-value">:lastName</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">first</span>(<span class="ruby-identifier">entry</span>.<span class="ruby-identifier">sn</span>).<span class="ruby-identifier">to_s</span>,
360
+ }
361
+ <span class="ruby-identifier">roleAccounts</span>.<span class="ruby-identifier">push</span>(<span class="ruby-identifier">first</span>(<span class="ruby-identifier">entry</span>.<span class="ruby-identifier">mail</span>).<span class="ruby-identifier">to_s</span>)
362
+ <span class="ruby-keyword">end</span>
363
+ <span class="ruby-identifier">ldapAccountAttachments</span>[<span class="ruby-identifier">ou</span>[<span class="ruby-string">&#39;role&#39;</span>].<span class="ruby-identifier">to_s</span>] = <span class="ruby-identifier">roleAccounts</span>
364
+ <span class="ruby-keyword">end</span>
365
+
366
+ <span class="ruby-comment"># compute diff</span>
367
+ <span class="ruby-identifier">report</span> = {
368
+ <span class="ruby-value">:createRoles</span> <span class="ruby-operator">=&gt;</span> [],
369
+ <span class="ruby-value">:deleteAccounts</span> <span class="ruby-operator">=&gt;</span> [],
370
+ <span class="ruby-value">:updateAccounts</span> <span class="ruby-operator">=&gt;</span> [],
371
+ <span class="ruby-value">:createAccounts</span> <span class="ruby-operator">=&gt;</span> [],
372
+ <span class="ruby-value">:createAccountAttachments</span> <span class="ruby-operator">=&gt;</span> [],
373
+ <span class="ruby-value">:deleteAccountAttachments</span> <span class="ruby-operator">=&gt;</span> [],
374
+ <span class="ruby-value">:deleteRoleGrants</span> <span class="ruby-operator">=&gt;</span> [],
375
+ <span class="ruby-value">:createRoleGrants</span> <span class="ruby-operator">=&gt;</span> [],
376
+ }
377
+ <span class="ruby-comment"># createRoles</span>
378
+ <span class="ruby-identifier">ldapRoles</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">roleName</span><span class="ruby-operator">|</span>
379
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">sdmRoles</span>[<span class="ruby-identifier">roleName</span>]
380
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:createRoles</span>].<span class="ruby-identifier">push</span>(<span class="ruby-identifier">roleName</span>)
381
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">plan</span>
382
+ <span class="ruby-identifier">response</span> = <span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">roles</span>.<span class="ruby-identifier">create</span>(<span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">Role</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value">name:</span> <span class="ruby-identifier">roleName</span>))
383
+ <span class="ruby-identifier">sdmRoles</span>[<span class="ruby-identifier">roleName</span>] = <span class="ruby-identifier">response</span>.<span class="ruby-identifier">role</span>.<span class="ruby-identifier">id</span>
384
+ <span class="ruby-keyword">end</span>
385
+ <span class="ruby-comment"># deleteAccounts</span>
386
+ <span class="ruby-identifier">sdmAccountsWithAttachments</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">email</span>, <span class="ruby-identifier">id</span><span class="ruby-operator">|</span>
387
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">ldapAccounts</span>[<span class="ruby-identifier">email</span>]
388
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:deleteAccounts</span>].<span class="ruby-identifier">push</span>(<span class="ruby-identifier">email</span>)
389
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">plan</span>
390
+ <span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">accounts</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">id</span>)
391
+ <span class="ruby-keyword">end</span>
392
+ <span class="ruby-comment"># updateAccounts</span>
393
+ <span class="ruby-identifier">sdmAccountsWithAttachments</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">email</span>, <span class="ruby-identifier">id</span><span class="ruby-operator">|</span>
394
+ <span class="ruby-identifier">ldapAccount</span> = <span class="ruby-identifier">ldapAccounts</span>[<span class="ruby-identifier">email</span>]
395
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-keyword">not</span> <span class="ruby-identifier">ldapAccount</span>
396
+ <span class="ruby-identifier">sdmAccount</span> = <span class="ruby-identifier">sdmAccountsById</span>[<span class="ruby-identifier">id</span>]
397
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">sdmAccount</span>[<span class="ruby-value">:firstName</span>] <span class="ruby-operator">==</span> <span class="ruby-identifier">ldapAccount</span>[<span class="ruby-value">:firstName</span>] <span class="ruby-keyword">and</span> <span class="ruby-identifier">sdmAccount</span>[<span class="ruby-value">:lastName</span>] <span class="ruby-operator">==</span> <span class="ruby-identifier">ldapAccount</span>[<span class="ruby-value">:lastName</span>]
398
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:updateAccounts</span>].<span class="ruby-identifier">push</span>(<span class="ruby-identifier">email</span>)
399
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">plan</span>
400
+ <span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">accounts</span>.<span class="ruby-identifier">update</span>(<span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">User</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value">id:</span> <span class="ruby-identifier">id</span>, <span class="ruby-value">first_name:</span> <span class="ruby-identifier">ldapAccount</span>[<span class="ruby-value">:firstName</span>], <span class="ruby-value">last_name:</span> <span class="ruby-identifier">ldapAccount</span>[<span class="ruby-value">:lastName</span>]))
401
+ <span class="ruby-keyword">end</span>
402
+ <span class="ruby-comment"># createAccounts</span>
403
+ <span class="ruby-identifier">ldapAccounts</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">email</span>, <span class="ruby-identifier">account</span><span class="ruby-operator">|</span>
404
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">sdmAccounts</span>[<span class="ruby-identifier">email</span>]
405
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:createAccounts</span>].<span class="ruby-identifier">push</span>(<span class="ruby-identifier">email</span>)
406
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">plan</span>
407
+ <span class="ruby-identifier">response</span> = <span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">accounts</span>.<span class="ruby-identifier">create</span>(<span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">User</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value">email:</span> <span class="ruby-identifier">email</span>, <span class="ruby-value">first_name:</span> <span class="ruby-identifier">account</span>[<span class="ruby-value">:firstName</span>], <span class="ruby-value">last_name:</span> <span class="ruby-identifier">account</span>[<span class="ruby-value">:lastName</span>]))
408
+ <span class="ruby-identifier">sdmAccounts</span>[<span class="ruby-identifier">response</span>.<span class="ruby-identifier">account</span>.<span class="ruby-identifier">email</span>] = <span class="ruby-identifier">response</span>.<span class="ruby-identifier">account</span>.<span class="ruby-identifier">id</span>
409
+ <span class="ruby-keyword">end</span>
410
+ <span class="ruby-comment"># deleteAccountAttachments</span>
411
+ <span class="ruby-identifier">sdmAccountAttachments</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">roleName</span>, <span class="ruby-identifier">accounts</span><span class="ruby-operator">|</span>
412
+ <span class="ruby-identifier">roleId</span> = <span class="ruby-identifier">sdmRoles</span>[<span class="ruby-identifier">roleName</span>]
413
+ <span class="ruby-identifier">ldapAccountsInRole</span> = <span class="ruby-identifier">ldapAccountAttachments</span>[<span class="ruby-identifier">roleName</span>]
414
+ <span class="ruby-identifier">accounts</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">email</span><span class="ruby-operator">|</span>
415
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">ldapAccountsInRole</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">ldapAccountsInRole</span>.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">email</span>
416
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:deleteAccountAttachments</span>].<span class="ruby-identifier">push</span>({ <span class="ruby-value">:role</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">roleName</span>, <span class="ruby-value">:account</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">email</span> })
417
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">plan</span>
418
+ <span class="ruby-identifier">accountId</span> = <span class="ruby-identifier">sdmAccounts</span>[<span class="ruby-identifier">email</span>]
419
+ <span class="ruby-identifier">attachment</span> = <span class="ruby-identifier">first</span>(<span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">account_attachments</span>.<span class="ruby-identifier">list</span>(<span class="ruby-string">&#39;accountid:? roleid:?&#39;</span>, <span class="ruby-identifier">accountId</span>, <span class="ruby-identifier">roleId</span>))
420
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-keyword">not</span> <span class="ruby-identifier">attachment</span> <span class="ruby-comment"># already deleted by the deleteAccounts step</span>
421
+ <span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">account_attachments</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">attachment</span>.<span class="ruby-identifier">id</span>)
422
+ <span class="ruby-keyword">end</span>
423
+ <span class="ruby-keyword">end</span>
424
+ <span class="ruby-comment"># createAccountAttachments</span>
425
+ <span class="ruby-identifier">ldapAccountAttachments</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">roleName</span>, <span class="ruby-identifier">accounts</span><span class="ruby-operator">|</span>
426
+ <span class="ruby-identifier">roleId</span> = <span class="ruby-identifier">sdmRoles</span>[<span class="ruby-identifier">roleName</span>]
427
+ <span class="ruby-identifier">sdmAccountsInRole</span> = <span class="ruby-identifier">sdmAccountAttachments</span>[<span class="ruby-identifier">roleName</span>]
428
+ <span class="ruby-identifier">accounts</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">email</span><span class="ruby-operator">|</span>
429
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">sdmAccountsInRole</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">sdmAccountsInRole</span>.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">email</span>
430
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:createAccountAttachments</span>].<span class="ruby-identifier">push</span>({ <span class="ruby-value">:role</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">roleName</span>, <span class="ruby-value">:account</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">email</span> })
431
+ <span class="ruby-identifier">accountId</span> = <span class="ruby-identifier">sdmAccounts</span>[<span class="ruby-identifier">email</span>]
432
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">plan</span>
433
+ <span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">account_attachments</span>.<span class="ruby-identifier">create</span>(<span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">AccountAttachment</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value">account_id:</span> <span class="ruby-identifier">accountId</span>, <span class="ruby-value">role_id:</span> <span class="ruby-identifier">roleId</span>))
434
+ <span class="ruby-keyword">end</span>
435
+ <span class="ruby-keyword">end</span>
436
+ <span class="ruby-comment"># deleteRoleGrants</span>
437
+ <span class="ruby-identifier">sdmRoleGrants</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">roleName</span>, <span class="ruby-identifier">roleGrants</span><span class="ruby-operator">|</span>
438
+ <span class="ruby-identifier">desired</span> = <span class="ruby-identifier">desiredRoleGrants</span>[<span class="ruby-identifier">roleName</span>]
439
+ <span class="ruby-identifier">roleGrants</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">grant</span><span class="ruby-operator">|</span>
440
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">desired</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">desired</span>.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">grant</span>[<span class="ruby-value">:resourceId</span>]
441
+ <span class="ruby-identifier">resourceName</span> = <span class="ruby-identifier">sdmResources</span>[<span class="ruby-identifier">grant</span>[<span class="ruby-value">:resourceId</span>]]
442
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:deleteRoleGrants</span>].<span class="ruby-identifier">push</span>({ <span class="ruby-value">:role</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">roleName</span>, <span class="ruby-value">:resource</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">resourceName</span>})
443
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">plan</span>
444
+ <span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">role_grants</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">grant</span>[<span class="ruby-value">:grantId</span>])
445
+ <span class="ruby-keyword">end</span>
446
+ <span class="ruby-keyword">end</span>
447
+ <span class="ruby-comment"># createRoleGrants</span>
448
+ <span class="ruby-identifier">desiredRoleGrants</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">roleName</span>, <span class="ruby-identifier">roleGrants</span><span class="ruby-operator">|</span>
449
+ <span class="ruby-identifier">roleId</span> = <span class="ruby-identifier">sdmRoles</span>[<span class="ruby-identifier">roleName</span>]
450
+ <span class="ruby-identifier">existing</span> = <span class="ruby-identifier">sdmRoleGrants</span>[<span class="ruby-identifier">roleName</span>]
451
+ <span class="ruby-identifier">roleGrants</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resourceId</span><span class="ruby-operator">|</span>
452
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">existing</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">existing</span>.<span class="ruby-identifier">find</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">existingGrant</span><span class="ruby-operator">|</span> <span class="ruby-identifier">existingGrant</span>[<span class="ruby-value">:resourceId</span>] <span class="ruby-operator">==</span> <span class="ruby-identifier">resourceId</span> }
453
+ <span class="ruby-identifier">resourceName</span> = <span class="ruby-identifier">sdmResources</span>[<span class="ruby-identifier">resourceId</span>]
454
+ <span class="ruby-identifier">report</span>[<span class="ruby-value">:createRoleGrants</span>].<span class="ruby-identifier">push</span>({ <span class="ruby-value">:role</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">roleName</span>, <span class="ruby-value">:resource</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">resourceName</span> })
455
+ <span class="ruby-keyword">next</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">plan</span>
456
+ <span class="ruby-identifier">sdmClient</span>.<span class="ruby-identifier">role_grants</span>.<span class="ruby-identifier">create</span>(<span class="ruby-constant">SDM</span><span class="ruby-operator">::</span><span class="ruby-constant">RoleGrant</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value">role_id:</span> <span class="ruby-identifier">roleId</span>, <span class="ruby-value">resource_id:</span> <span class="ruby-identifier">resourceId</span>))
457
+ <span class="ruby-keyword">end</span>
458
+ <span class="ruby-keyword">end</span>
459
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">verbose</span>
460
+ <span class="ruby-identifier">puts</span> <span class="ruby-constant">JSON</span>.<span class="ruby-identifier">pretty_generate</span>(<span class="ruby-identifier">report</span>)
461
+ <span class="ruby-keyword">else</span>
462
+ <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Create #{report[:createRoles].length} roles&quot;</span>
463
+ <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Delete #{report[:deleteAccounts].length} accounts&quot;</span>
464
+ <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Create #{report[:createAccounts].length} accounts&quot;</span>
465
+ <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Delete #{report[:deleteAccountAttachments].length} account attachments&quot;</span>
466
+ <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Create #{report[:createAccountAttachments].length} account attachments&quot;</span>
467
+ <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Delete #{report[:deleteRoleGrants].length} role grants&quot;</span>
468
+ <span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Create #{report[:createRoleGrants].length} role grants&quot;</span>
469
+ <span class="ruby-keyword">end</span>
470
+ <span class="ruby-keyword">end</span></pre>
471
+ </div>
472
+
473
+ </div>
474
+
475
+
476
+
477
+
478
+ </div>
479
+
480
+
158
481
  <div id="method-i-main" class="method-detail ">
159
482
 
160
483
  <div class="method-heading">
@@ -307,7 +307,7 @@
307
307
 
308
308
 
309
309
  <div class="method-source-code" id="new-source">
310
- <pre><span class="ruby-comment"># File lib/models/porcelain.rb, line 1956</span>
310
+ <pre><span class="ruby-comment"># File lib/models/porcelain.rb, line 1936</span>
311
311
  <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">initialize</span>(
312
312
  <span class="ruby-value">id:</span><span class="ruby-keyword">nil</span> \
313
313
  ,
@@ -412,7 +412,7 @@
412
412
 
413
413
 
414
414
  <div class="method-source-code" id="to_json-source">
415
- <pre><span class="ruby-comment"># File lib/models/porcelain.rb, line 2023</span>
415
+ <pre><span class="ruby-comment"># File lib/models/porcelain.rb, line 2003</span>
416
416
  <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">to_json</span>(<span class="ruby-identifier">options</span>={})
417
417
  <span class="ruby-identifier">hash</span> = {}
418
418
  <span class="ruby-keyword">self</span>.<span class="ruby-identifier">instance_variables</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">var</span><span class="ruby-operator">|</span>
@@ -255,7 +255,7 @@
255
255
 
256
256
 
257
257
  <div class="method-source-code" id="new-source">
258
- <pre><span class="ruby-comment"># File lib/models/porcelain.rb, line 2051</span>
258
+ <pre><span class="ruby-comment"># File lib/models/porcelain.rb, line 2031</span>
259
259
  <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">initialize</span>(
260
260
  <span class="ruby-value">id:</span><span class="ruby-keyword">nil</span> \
261
261
  ,
@@ -340,7 +340,7 @@
340
340
 
341
341
 
342
342
  <div class="method-source-code" id="to_json-source">
343
- <pre><span class="ruby-comment"># File lib/models/porcelain.rb, line 2098</span>
343
+ <pre><span class="ruby-comment"># File lib/models/porcelain.rb, line 2078</span>
344
344
  <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">to_json</span>(<span class="ruby-identifier">options</span>={})
345
345
  <span class="ruby-identifier">hash</span> = {}
346
346
  <span class="ruby-keyword">self</span>.<span class="ruby-identifier">instance_variables</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">var</span><span class="ruby-operator">|</span>
@@ -242,7 +242,7 @@
242
242
 
243
243
 
244
244
  <div class="method-source-code" id="new-source">
245
- <pre><span class="ruby-comment"># File lib/models/porcelain.rb, line 2124</span>
245
+ <pre><span class="ruby-comment"># File lib/models/porcelain.rb, line 2104</span>
246
246
  <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">initialize</span>(
247
247
  <span class="ruby-value">id:</span><span class="ruby-keyword">nil</span> \
248
248
  ,
@@ -322,7 +322,7 @@
322
322
 
323
323
 
324
324
  <div class="method-source-code" id="to_json-source">
325
- <pre><span class="ruby-comment"># File lib/models/porcelain.rb, line 2166</span>
325
+ <pre><span class="ruby-comment"># File lib/models/porcelain.rb, line 2146</span>
326
326
  <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">to_json</span>(<span class="ruby-identifier">options</span>={})
327
327
  <span class="ruby-identifier">hash</span> = {}
328
328
  <span class="ruby-keyword">self</span>.<span class="ruby-identifier">instance_variables</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">var</span><span class="ruby-operator">|</span>
@@ -179,7 +179,7 @@
179
179
 
180
180
 
181
181
  <div class="method-source-code" id="new-source">
182
- <pre><span class="ruby-comment"># File lib/models/porcelain.rb, line 234</span>
182
+ <pre><span class="ruby-comment"># File lib/models/porcelain.rb, line 214</span>
183
183
  <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">initialize</span>(
184
184
  <span class="ruby-value">id:</span><span class="ruby-keyword">nil</span> \
185
185
  ,
@@ -234,7 +234,7 @@
234
234
 
235
235
 
236
236
  <div class="method-source-code" id="to_json-source">
237
- <pre><span class="ruby-comment"># File lib/models/porcelain.rb, line 251</span>
237
+ <pre><span class="ruby-comment"># File lib/models/porcelain.rb, line 231</span>
238
238
  <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">to_json</span>(<span class="ruby-identifier">options</span>={})
239
239
  <span class="ruby-identifier">hash</span> = {}
240
240
  <span class="ruby-keyword">self</span>.<span class="ruby-identifier">instance_variables</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">var</span><span class="ruby-operator">|</span>
@@ -179,7 +179,7 @@
179
179
 
180
180
 
181
181
  <div class="method-source-code" id="new-source">
182
- <pre><span class="ruby-comment"># File lib/models/porcelain.rb, line 142</span>
182
+ <pre><span class="ruby-comment"># File lib/models/porcelain.rb, line 122</span>
183
183
  <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">initialize</span>(
184
184
  <span class="ruby-value">meta:</span><span class="ruby-keyword">nil</span> \
185
185
  ,
@@ -234,7 +234,7 @@
234
234
 
235
235
 
236
236
  <div class="method-source-code" id="to_json-source">
237
- <pre><span class="ruby-comment"># File lib/models/porcelain.rb, line 159</span>
237
+ <pre><span class="ruby-comment"># File lib/models/porcelain.rb, line 139</span>
238
238
  <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">to_json</span>(<span class="ruby-identifier">options</span>={})
239
239
  <span class="ruby-identifier">hash</span> = {}
240
240
  <span class="ruby-keyword">self</span>.<span class="ruby-identifier">instance_variables</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">var</span><span class="ruby-operator">|</span>