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 +4 -4
- data/README.md +11 -1
- data/lib/terraorg/model/org.rb +35 -9
- data/lib/terraorg/version.rb +1 -1
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 46107b71a1eace06c51463513c5b495b9549ec19ebc911103ec0d7f236fec6f8
|
4
|
+
data.tar.gz: b05708c67d359a3040eca8724140603d5c4debd6e2f1a25c87034e8a9b60e7be
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
data/lib/terraorg/model/org.rb
CHANGED
@@ -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
|
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
|
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
|
197
|
-
|
198
|
-
|
205
|
+
def generate_tf_platoons
|
206
|
+
@member_platoons.map { |p| p.generate_tf(@id) }.join("\n")
|
207
|
+
end
|
199
208
|
|
200
|
-
|
201
|
-
|
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 = "#{
|
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
|
|
data/lib/terraorg/version.rb
CHANGED
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.
|
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-
|
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.
|
121
|
+
rubygems_version: 3.0.8
|
108
122
|
signing_key:
|
109
123
|
specification_version: 4
|
110
124
|
summary: terraorg
|