terraorg 0.3.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ce81d4e08d1d925fbf0cc419b5012725e33190563592d8ad491bf52a39df2920
4
- data.tar.gz: 1854959244ef5576f9c39f3079ae73e7af243f591c972e3f79ecfb9729a87445
3
+ metadata.gz: 46107b71a1eace06c51463513c5b495b9549ec19ebc911103ec0d7f236fec6f8
4
+ data.tar.gz: b05708c67d359a3040eca8724140603d5c4debd6e2f1a25c87034e8a9b60e7be
5
5
  SHA512:
6
- metadata.gz: 498d390c6eb73ff5761ccc40e8a0918d8c0e1ec8ac21d2d5862a9d9b0c7da514e574849a853cb9fce4b8516625bcb72ef6bcc39b2de52e80cbf13fef6e62a5a8
7
- data.tar.gz: 72575c047b7565108453002e809fa2c76346e6a8998f04ff52750c065ecb48eb1b9235f0d0a6cd2e967b81292e30a668d91339b9d1bc26e7fc520669a47a750f
6
+ metadata.gz: 9f9286df25676340a5e3a36221f5b7de4ed21cce63281850210f18b360474544e453939b8b4559dec6cb58dfa0b9ce5facca21570f03295cb5f9d0b5c56eff57
7
+ data.tar.gz: 196d63d8df921c54216511ee7604b6ec8f8813241609a1fb0c4fa5480d965c4d2e9f0b2042a0f55a46b1fbaa8cb633f50317608afbf68f71d42b8b00fc877f83
data/README.md CHANGED
@@ -34,7 +34,9 @@ Based on the org that this tool was originally designed for, orgs are expected
34
34
  to have three levels:
35
35
 
36
36
  * *squads*: the base unit of team-dom, containing people, who may be in
37
- different geographical regions.
37
+ different geographical regions. Teams contain _members_ (full time heads)
38
+ and _associates_ (typically part time floaters.) Any associate of a squad
39
+ must also have a home squad for which they are a full time member.
38
40
  * *platoons*: a unit which contains squads and exceptional people who are
39
41
  members of the platoon, but not part of any squad
40
42
  * *org*: The whole organization, including its manager, any exceptional squads
@@ -45,6 +47,10 @@ The tool generates groups for each granular unit of organization in Okta and G
45
47
  Suite in Terraform. With patching, it could be possible for more organizational
46
48
  systems to be supported.
47
49
 
50
+ ## Diagram
51
+
52
+ ![Diagram of org structure](img/diagram.png)
53
+
48
54
  ## How it works
49
55
 
50
56
  Firstly, take your entire existing organization and define it using the
@@ -120,6 +126,10 @@ information on how to configure the providers.
120
126
  [articulate/terraform-provider-okta]: https://github.com/articulate/terraform-provider-okta
121
127
  [DeviaVir/terraform-provider-gsuite]: https://github.com/DeviaVir/terraform-provider-gsuite
122
128
 
129
+ ## Running tests
130
+ There are a limited number of tests that can be invoked with
131
+ `ruby -I lib test/terraorg/model/org_test.rb `
132
+
123
133
  ## Suggested process
124
134
 
125
135
  At [LiveRamp], a pull request based workflow leveraging [Atlantis] is used to
@@ -54,7 +54,7 @@ class Org
54
54
 
55
55
  # Do not allow the JSON files to contain any people who have left.
56
56
  unless @people.inactive.empty?
57
- $stderr.puts "ERROR: Users have left the company: #{@people.inactive.map(&:id).join(', ')}"
57
+ $stderr.puts "ERROR: Users have left the company, or are Suspended in Okta: #{@people.inactive.map(&:id).join(', ')}"
58
58
  failure = true
59
59
  end
60
60
 
@@ -97,7 +97,8 @@ class Org
97
97
  # across the entire org. A person can be an associate of other squads
98
98
  # at a different count. See top of file for defined limits.
99
99
  squad_count = {}
100
- all_squads.map(&:teams).flatten.map(&:values).flatten.map(&:members).flatten.each do |member|
100
+ all_members = all_squads.map(&:teams).flatten.map(&:values).flatten.map(&:members).flatten
101
+ all_members.each do |member|
101
102
  squad_count[member.id] = squad_count.fetch(member.id, 0) + 1
102
103
  end
103
104
  more_than_max_squads = squad_count.select do |member, count|
@@ -109,7 +110,8 @@ class Org
109
110
  end
110
111
 
111
112
  associate_count = {}
112
- all_squads.map(&:teams).flatten.map(&:values).flatten.map(&:associates).flatten.each do |assoc|
113
+ all_associates = all_squads.map(&:teams).flatten.map(&:values).flatten.map(&:associates).flatten
114
+ all_associates.each do |assoc|
113
115
  associate_count[assoc.id] = associate_count.fetch(assoc.id, 0) + 1
114
116
  end
115
117
  more_than_max_squads = associate_count.select do |_, count|
@@ -130,6 +132,13 @@ class Org
130
132
  failure = true
131
133
  end
132
134
 
135
+ # Validate that any associate is a member of some squad
136
+ associates_but_not_members = Set.new(all_associates.map(&:id)) - Set.new(all_members.map(&:id)) - exceptions
137
+ if !associates_but_not_members.empty?
138
+ $stderr.puts "ERROR: #{associates_but_not_members.map(&:id)} are associates of squads but not members of any squad"
139
+ failure = true
140
+ end
141
+
133
142
  raise "CRITICAL: Validation failed due to at least one error above" if failure && strict
134
143
  end
135
144
 
@@ -193,13 +202,16 @@ class Org
193
202
  md_lines.join("\n")
194
203
  end
195
204
 
196
- def generate_tf
197
- tf = @member_platoons.map { |p| p.generate_tf(@id) }.join("\n")
198
- File.write('auto.platoons.tf', tf)
205
+ def generate_tf_platoons
206
+ @member_platoons.map { |p| p.generate_tf(@id) }.join("\n")
207
+ end
199
208
 
200
- tf = @member_exception_squads.map { |s| s.generate_tf(@id) }.join("\n")
201
- File.write('auto.exception_squads.tf', tf)
209
+ def generate_tf_squads
210
+ @member_exception_squads.map { |s| s.generate_tf(@id) }.join("\n")
211
+ end
202
212
 
213
+ def generate_tf_org
214
+ tf = ''
203
215
  # Roll all platoons and exception squads into the org.
204
216
  roll_up_to_org = \
205
217
  @member_exception_squads.map { |s| s.unique_name(@id, nil) } + \
@@ -239,14 +251,18 @@ EOF
239
251
  all_locations[@manager_location] = all_locations.fetch(@manager_location, Set.new).add(@manager)
240
252
 
241
253
  all_locations.each do |l, m|
254
+ description = "#{@name} organization members based in #{l} (terraorg)"
242
255
  name = "#{unique_name}-#{l.downcase}"
243
256
  tf += <<-EOF
244
257
  resource "okta_group" "#{name}" {
245
258
  name = "#{name}"
246
- description = "#{@name} organization members based in #{l} (terraorg)"
259
+ description = "#{description}"
247
260
  users = #{Util.persons_tf(m)}
248
261
  }
262
+
263
+ #{Util.gsuite_group_tf(name, @gsuite_domain, m, description)}
249
264
  EOF
265
+
250
266
  end
251
267
 
252
268
  # Generate a special GSuite group for all managers (org, platoon, squad
@@ -255,7 +271,17 @@ EOF
255
271
  all_managers = Set.new([@manager] + @platoons.all.map(&:manager) + @squads.all.map(&:manager).select { |m| m })
256
272
  manager_dl = "#{@id}-managers"
257
273
  tf += Util.gsuite_group_tf(manager_dl, @gsuite_domain, all_managers, "All managers of the #{@name} organization (terraorg)")
274
+ tf
275
+ end
276
+
277
+ def generate_tf
278
+ tf = generate_tf_platoons
279
+ File.write('auto.platoons.tf', tf)
280
+
281
+ tf = generate_tf_squads
282
+ File.write('auto.exception_squads.tf', tf)
258
283
 
284
+ tf = generate_tf_org
259
285
  File.write('auto.org.tf', tf)
260
286
  end
261
287
 
@@ -13,5 +13,5 @@
13
13
  # limitations under the License.
14
14
 
15
15
  module Terraorg
16
- VERSION = '0.3.0'
16
+ VERSION = '0.5.0'
17
17
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: terraorg
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua Kwan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-27 00:00:00.000000000 Z
11
+ date: 2020-10-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: countries
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0.2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '5.14'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '5.14'
69
83
  description: Manage an organizational structure with Okta and G-Suite using Terraform
70
84
  email: joshk@triplehelix.org
71
85
  executables:
@@ -104,7 +118,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
104
118
  - !ruby/object:Gem::Version
105
119
  version: '0'
106
120
  requirements: []
107
- rubygems_version: 3.0.3
121
+ rubygems_version: 3.0.8
108
122
  signing_key:
109
123
  specification_version: 4
110
124
  summary: terraorg