ogre 0.1.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/.coveralls.yml +1 -0
- data/.gitignore +20 -0
- data/.rubocop.yml +16 -0
- data/.travis.yml +3 -0
- data/Gemfile +4 -0
- data/README.md +102 -0
- data/Rakefile +18 -0
- data/bin/ogre +4 -0
- data/lib/ogre.rb +44 -0
- data/lib/ogre/associate.rb +57 -0
- data/lib/ogre/base.rb +21 -0
- data/lib/ogre/config.rb +18 -0
- data/lib/ogre/messages.rb +84 -0
- data/lib/ogre/org-create.rb +96 -0
- data/lib/ogre/org-delete.rb +29 -0
- data/lib/ogre/runner.rb +40 -0
- data/lib/ogre/set-private-key.rb +57 -0
- data/lib/ogre/skeletons/code_generator/files/default/chefignore +95 -0
- data/lib/ogre/skeletons/code_generator/files/default/cookbook_readmes/README-policy.md +9 -0
- data/lib/ogre/skeletons/code_generator/files/default/cookbook_readmes/README.md +54 -0
- data/lib/ogre/skeletons/code_generator/files/default/gitignore +16 -0
- data/lib/ogre/skeletons/code_generator/files/default/repo/README.md +66 -0
- data/lib/ogre/skeletons/code_generator/files/default/repo/cookbooks/example/attributes/default.rb +7 -0
- data/lib/ogre/skeletons/code_generator/files/default/repo/cookbooks/example/metadata.rb +3 -0
- data/lib/ogre/skeletons/code_generator/files/default/repo/cookbooks/example/recipes/default.rb +8 -0
- data/lib/ogre/skeletons/code_generator/files/default/repo/data_bags/README.md +58 -0
- data/lib/ogre/skeletons/code_generator/files/default/repo/data_bags/example/example_item.json +4 -0
- data/lib/ogre/skeletons/code_generator/files/default/repo/environments/README.md +9 -0
- data/lib/ogre/skeletons/code_generator/files/default/repo/environments/_default.json +9 -0
- data/lib/ogre/skeletons/code_generator/files/default/repo/environments/dev.json +21 -0
- data/lib/ogre/skeletons/code_generator/files/default/repo/environments/example.json +13 -0
- data/lib/ogre/skeletons/code_generator/files/default/repo/environments/int.json +21 -0
- data/lib/ogre/skeletons/code_generator/files/default/repo/environments/prod.json +21 -0
- data/lib/ogre/skeletons/code_generator/files/default/repo/environments/qa.json +21 -0
- data/lib/ogre/skeletons/code_generator/files/default/repo/environments/stage.json +21 -0
- data/lib/ogre/skeletons/code_generator/files/default/repo/roles/README.md +9 -0
- data/lib/ogre/skeletons/code_generator/files/default/repo/roles/active-base.json +12 -0
- data/lib/ogre/skeletons/code_generator/files/default/repo/roles/example.json +13 -0
- data/lib/ogre/skeletons/code_generator/files/default/repo/roles/loc_caeast.json +13 -0
- data/lib/ogre/skeletons/code_generator/files/default/repo/roles/loc_canada.json +13 -0
- data/lib/ogre/skeletons/code_generator/files/default/repo/roles/loc_cawest.json +13 -0
- data/lib/ogre/skeletons/code_generator/files/default/repo/roles/loc_useast.json +13 -0
- data/lib/ogre/skeletons/code_generator/files/default/repo/roles/loc_uswest.json +13 -0
- data/lib/ogre/skeletons/code_generator/metadata.rb +8 -0
- data/lib/ogre/skeletons/code_generator/recipes/repo.rb +52 -0
- data/lib/ogre/skeletons/code_generator/templates/default/LICENSE.all_rights.erb +3 -0
- data/lib/ogre/skeletons/code_generator/templates/default/LICENSE.apache2.erb +201 -0
- data/lib/ogre/skeletons/code_generator/templates/default/LICENSE.gplv2.erb +339 -0
- data/lib/ogre/skeletons/code_generator/templates/default/LICENSE.gplv3.erb +674 -0
- data/lib/ogre/skeletons/code_generator/templates/default/LICENSE.mit.erb +21 -0
- data/lib/ogre/skeletons/code_generator/templates/default/README.md.erb +4 -0
- data/lib/ogre/skeletons/code_generator/templates/default/cookbook_file.erb +0 -0
- data/lib/ogre/skeletons/code_generator/templates/default/knife.rb.erb +44 -0
- data/lib/ogre/skeletons/code_generator/templates/default/metadata.rb.erb +8 -0
- data/lib/ogre/skeletons/code_generator/templates/default/repo/gitignore.erb +11 -0
- data/lib/ogre/user-create.rb +40 -0
- data/lib/ogre/user-delete.rb +39 -0
- data/lib/ogre/version.rb +5 -0
- data/ogre.gemspec +45 -0
- data/spec/fixtures/client_key/dummy.pem +27 -0
- data/spec/fixtures/vcr_cassettes/associate-no-org.yml +65 -0
- data/spec/fixtures/vcr_cassettes/associate-no-user.yml +65 -0
- data/spec/fixtures/vcr_cassettes/associate-user-exists.yml +135 -0
- data/spec/fixtures/vcr_cassettes/associate.yml +406 -0
- data/spec/fixtures/vcr_cassettes/org-create-exists.yml +69 -0
- data/spec/fixtures/vcr_cassettes/org-create.yml +71 -0
- data/spec/fixtures/vcr_cassettes/org-delete-no-org.yml +61 -0
- data/spec/fixtures/vcr_cassettes/org-delete.yml +68 -0
- data/spec/fixtures/vcr_cassettes/set-private-key.yml +239 -0
- data/spec/fixtures/vcr_cassettes/user-create-bad-email.yml +66 -0
- data/spec/fixtures/vcr_cassettes/user-create-exists.yml +70 -0
- data/spec/fixtures/vcr_cassettes/user-create-short-password.yml +66 -0
- data/spec/fixtures/vcr_cassettes/user-create.yml +72 -0
- data/spec/fixtures/vcr_cassettes/user-delete-not-found.yml +61 -0
- data/spec/fixtures/vcr_cassettes/user-delete.yml +136 -0
- data/spec/ogre/associate_spec.rb +67 -0
- data/spec/ogre/org-create_spec.rb +52 -0
- data/spec/ogre/org-delete_spec.rb +34 -0
- data/spec/ogre/set-private-key_spec.rb +16 -0
- data/spec/ogre/user-create_spec.rb +58 -0
- data/spec/ogre/user-delete_spec.rb +34 -0
- data/spec/spec_helper.rb +16 -0
- metadata +349 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: a4a6d483c682f21f5060bdbd3e0c1de49b3c6fff
|
|
4
|
+
data.tar.gz: 2a244953732b78a5bc112629328f8e78271f8399
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 6b7bea37adf94bc417f3285e201e1f15b92efe273a7fd8734b5678ea16ae8a632bf6239f1ddb48ddf181a9240706a790f9cae2a6771bc7be84e0765c1a6c15a9
|
|
7
|
+
data.tar.gz: 1e47e713424344b4647106da1d541271465ec545a54850674f7f46b737f44ee5e97d859f58c192cab810a47404c6c0b1a5e916960427a91020c3542877481898
|
data/.coveralls.yml
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
service_name: travis-ci
|
data/.gitignore
ADDED
data/.rubocop.yml
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
AllCops:
|
|
2
|
+
Exclude:
|
|
3
|
+
- Guardfile
|
|
4
|
+
- vendor/**/*
|
|
5
|
+
- lib/ogre/skeletons/**/*
|
|
6
|
+
- tmp/**/*
|
|
7
|
+
Metrics/AbcSize:
|
|
8
|
+
Enabled: false
|
|
9
|
+
Metrics/LineLength:
|
|
10
|
+
Max: 120
|
|
11
|
+
Metrics/MethodLength:
|
|
12
|
+
Max: 50
|
|
13
|
+
Style/SpecialGlobalVars:
|
|
14
|
+
Enabled: false
|
|
15
|
+
Style/FileName:
|
|
16
|
+
Enabled: false
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
[](https://travis-ci.org/activenetwork-automation/ogre)
|
|
2
|
+
[](https://coveralls.io/r/activenetwork-automation/ogre)
|
|
3
|
+
[](https://gemnasium.com/activenetwork-automation/ogre)
|
|
4
|
+
[](http://inch-ci.org/github/activenetwork-automation/ogre)
|
|
5
|
+
|
|
6
|
+
# Ogre
|
|
7
|
+
|
|
8
|
+
This gem supports organization and user management for Enterprise Chef.
|
|
9
|
+
|
|
10
|
+
While this functionality already exists in [knife-opc](https://github.com/chef/knife-opc), we wanted to be able to create the chef policy repository as well and set the private key into vCenter Orchestrator all in one tool.
|
|
11
|
+
|
|
12
|
+
## Installation
|
|
13
|
+
|
|
14
|
+
`gem install ogre`
|
|
15
|
+
|
|
16
|
+
## Configuration
|
|
17
|
+
|
|
18
|
+
### ~/.ogre/config.json
|
|
19
|
+
|
|
20
|
+
All of the parameters here are optional and can be passed in and/or overriden at the CLI. As of today, the `pivotal` user is the only user able to execute certain methods via the [Chef API](https://docs.chef.io/api_chef_server.html). The key can be found in `/etc/opscode/pivotal.pem` on the Enterprise Chef box.
|
|
21
|
+
|
|
22
|
+
``` json
|
|
23
|
+
{
|
|
24
|
+
"run_as":"chef_username",
|
|
25
|
+
"key_path":"/path/to/key.pem",
|
|
26
|
+
"server_url":"https://chef.url",
|
|
27
|
+
"vco_url":"https://vco.url:8281/",
|
|
28
|
+
"vco_user": "domain\\user",
|
|
29
|
+
"vco_password":"password",
|
|
30
|
+
"vco_wf_name":"vco_workflow_name",
|
|
31
|
+
"vco_verify_ssl":"false"
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Usage
|
|
37
|
+
ogre org-create ORG DESCRIPTION (options)
|
|
38
|
+
---
|
|
39
|
+
- `-p`, `--create-repo` Create Chef policy repository
|
|
40
|
+
- `-P`, `--repo-path` Chef policy repo path
|
|
41
|
+
- `-I`, `--license=LICENSE` Chef policy repository license
|
|
42
|
+
- `-m`, `--email=EMAIL` Chef policy repository e-mail
|
|
43
|
+
- `-C`, `--authors=AUTHORS` Chef policy repository authors
|
|
44
|
+
|
|
45
|
+
When using `-p`, Ogre will save the Chef policy repository as ~/.ogre/ORG-chef, otherwise it will output the validator key for the new organization.
|
|
46
|
+
|
|
47
|
+
ogre org-delete ORG (options)
|
|
48
|
+
---
|
|
49
|
+
- `-f`, `--force` Delete without confirmation
|
|
50
|
+
|
|
51
|
+
ogre user-create USERNAME FIRST_NAME LAST_NAME EMAIL PASSWORD (options)
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
ogre user-delete USERNAME (options)
|
|
55
|
+
---
|
|
56
|
+
- `-f`, `--force` Delete without confirmation
|
|
57
|
+
|
|
58
|
+
ogre associate ORG USER (options)
|
|
59
|
+
---
|
|
60
|
+
- `-a`, `--admin` Add user to admin group within organization
|
|
61
|
+
|
|
62
|
+
ogre set-private-key CHEF_HOSTNAME CHEF_VALIDATOR_NAME KEY_PATH (options)
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
`set-private-key` is very opinionated to our needs. We have a vco workflow called `Set Private Key` which takes in `CHEF_HOSTNAME`, `CHEF_VALIDATOR_NAME`, and `KEY_PATH`. This is stored in Orchestrator so that our organzation has the correct permissions to bootstrap nodes.
|
|
66
|
+
|
|
67
|
+
- `--vco-url` vCenter Orchestrator URL
|
|
68
|
+
- `--vco-user` vCenter Orchestrator user
|
|
69
|
+
- `--vco-password` vCenter Orchestrator password
|
|
70
|
+
- `--vco-wf-name` vCenter Orchestrator workflow name
|
|
71
|
+
- `--vco-verify-ssl` vCenter Orchestrator verify ssl
|
|
72
|
+
|
|
73
|
+
## Contributing
|
|
74
|
+
|
|
75
|
+
1. Fork it ( https://github.com/activenetwork-automation/ogre/fork )
|
|
76
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
|
77
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
|
78
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
|
79
|
+
5. Create a new Pull Request
|
|
80
|
+
|
|
81
|
+
### License and Authors
|
|
82
|
+
|
|
83
|
+
- [Joe Nguyen](https://github.com/joenguyen)
|
|
84
|
+
|
|
85
|
+
## License ##
|
|
86
|
+
|
|
87
|
+
| | |
|
|
88
|
+
|:---------------------|:-----------------------------------------|
|
|
89
|
+
| **Copyright:** | Copyright 2015 ACTIVE Network, LLC
|
|
90
|
+
| **License:** | Apache License, Version 2.0
|
|
91
|
+
|
|
92
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
93
|
+
you may not use this file except in compliance with the License.
|
|
94
|
+
You may obtain a copy of the License at
|
|
95
|
+
|
|
96
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
97
|
+
|
|
98
|
+
Unless required by applicable law or agreed to in writing, software
|
|
99
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
100
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
101
|
+
See the License for the specific language governing permissions and
|
|
102
|
+
limitations under the License.
|
data/Rakefile
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'bundler'
|
|
2
|
+
require 'rspec/core/rake_task'
|
|
3
|
+
require 'coveralls/rake/task'
|
|
4
|
+
require 'yard'
|
|
5
|
+
|
|
6
|
+
Bundler::GemHelper.install_tasks
|
|
7
|
+
RSpec::Core::RakeTask.new(:spec)
|
|
8
|
+
Coveralls::RakeTask.new
|
|
9
|
+
|
|
10
|
+
task :style do
|
|
11
|
+
sh 'rubocop'
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
task :doc do
|
|
15
|
+
sh 'yard'
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
task default: [:spec, :style, :doc, 'coveralls:push']
|
data/bin/ogre
ADDED
data/lib/ogre.rb
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
require 'thor'
|
|
2
|
+
require 'highline/import'
|
|
3
|
+
require 'ogre/messages'
|
|
4
|
+
require 'ogre/config'
|
|
5
|
+
require 'ogre/base'
|
|
6
|
+
require 'ogre/associate'
|
|
7
|
+
require 'ogre/org-create'
|
|
8
|
+
require 'ogre/org-delete'
|
|
9
|
+
require 'ogre/set-private-key'
|
|
10
|
+
require 'ogre/user-create'
|
|
11
|
+
require 'ogre/user-delete'
|
|
12
|
+
|
|
13
|
+
module Ogre
|
|
14
|
+
# Start of main CLI
|
|
15
|
+
class CLI < Thor
|
|
16
|
+
package_name 'ogre'
|
|
17
|
+
map '--version' => :version
|
|
18
|
+
map '-v' => :version
|
|
19
|
+
|
|
20
|
+
desc 'version, -v', DESC_VERSION
|
|
21
|
+
# Display the version of `ogre`
|
|
22
|
+
def version
|
|
23
|
+
puts VERSION
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# rubocop:disable LineLength
|
|
27
|
+
# subcommand in Thor called as registered class
|
|
28
|
+
register(OrgCreate, 'org_create', 'org-create ' << OrgCreate.arguments.map(&:name).join(' ').upcase, DESC_CREATE)
|
|
29
|
+
register(OrgDelete, 'org_delete', 'org-delete ' << OrgDelete.arguments.map(&:name).join(' ').upcase, DESC_DELETE)
|
|
30
|
+
register(UserCreate, 'user_create', 'user-create ' << UserCreate.arguments.map(&:name).join(' ').upcase, DESC_CREATE_USER)
|
|
31
|
+
register(UserDelete, 'user_delete', 'user-delete ' << UserDelete.arguments.map(&:name).join(' ').upcase, DESC_DELETE_USER)
|
|
32
|
+
register(Associate, 'associate', 'associate ' << Associate.arguments.map(&:name).join(' ').upcase, DESC_ASSOCIATE_USERS)
|
|
33
|
+
register(SetPrivateKey, 'set_private_key', 'set-private-key ' << SetPrivateKey.arguments.map(&:name).join(' ').upcase, DESC_SET_PRIVATE_KEY)
|
|
34
|
+
# rubocop:enable LineLength
|
|
35
|
+
|
|
36
|
+
# Workarounds to include options in 'ogre help command'
|
|
37
|
+
tasks['user_create'].options = UserCreate.class_options
|
|
38
|
+
tasks['user_delete'].options = UserDelete.class_options
|
|
39
|
+
tasks['org_create'].options = OrgCreate.class_options
|
|
40
|
+
tasks['org_delete'].options = OrgDelete.class_options
|
|
41
|
+
tasks['associate'].options = Associate.class_options
|
|
42
|
+
tasks['set_private_key'].options = SetPrivateKey.class_options
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
module Ogre
|
|
2
|
+
# Associate user to org while bypassing the association request
|
|
3
|
+
class Associate < Ogre::Base
|
|
4
|
+
include Thor::Actions
|
|
5
|
+
|
|
6
|
+
# required
|
|
7
|
+
argument :org, type: :string, desc: DESC_ORG
|
|
8
|
+
argument :user, type: :string, desc: DESC_USER
|
|
9
|
+
|
|
10
|
+
# optional
|
|
11
|
+
class_option :admin, aliases: '-a', type: :boolean, desc: DESC_ASSOCIATE_ADMIN
|
|
12
|
+
|
|
13
|
+
# Associate user to org while bypassing the association request
|
|
14
|
+
def associate
|
|
15
|
+
begin
|
|
16
|
+
# associate (invite) user
|
|
17
|
+
request_body = { user: user }
|
|
18
|
+
response = chef_rest.post_rest "organizations/#{org}/association_requests", request_body
|
|
19
|
+
|
|
20
|
+
# add (force) user to org
|
|
21
|
+
association_id = response['uri'].split('/').last
|
|
22
|
+
chef_rest.put_rest "users/#{user}/association_requests/#{association_id}", response: 'accept'
|
|
23
|
+
rescue Net::HTTPServerException => e
|
|
24
|
+
# already exists -- i will allow it
|
|
25
|
+
if e.response.code == '409'
|
|
26
|
+
puts "User '#{user}' already associated with organization '#{org}'"
|
|
27
|
+
else
|
|
28
|
+
raise e
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# add to admin?
|
|
33
|
+
groups = ['users']
|
|
34
|
+
groups << 'admins' if options[:admin]
|
|
35
|
+
|
|
36
|
+
# add user to group(s)
|
|
37
|
+
groups.each do |groupname|
|
|
38
|
+
group = chef_rest.get_rest "organizations/#{org}/groups/#{groupname}"
|
|
39
|
+
# check if user is in group
|
|
40
|
+
unless group['actors'].include?(user)
|
|
41
|
+
body_hash = {
|
|
42
|
+
groupname: "#{groupname}",
|
|
43
|
+
actors: {
|
|
44
|
+
users: group['actors'].concat([user]),
|
|
45
|
+
groups: group['groups']
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
# associate user
|
|
50
|
+
chef_rest.put_rest "organizations/#{org}/groups/#{groupname}", body_hash
|
|
51
|
+
puts "Successfully added '#{user}' to '#{groupname}' in the #{org} org"
|
|
52
|
+
end
|
|
53
|
+
next
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
data/lib/ogre/base.rb
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
require 'chef/rest'
|
|
2
|
+
|
|
3
|
+
# Refer to README.md for use instructions
|
|
4
|
+
module Ogre
|
|
5
|
+
# Base ogre class includes common parameters used to authenticate with Chef::REST
|
|
6
|
+
class Base < Thor::Group
|
|
7
|
+
include Thor::Actions
|
|
8
|
+
|
|
9
|
+
# Chef Rest parameters
|
|
10
|
+
class_option :server_url, type: :string, desc: DESC_CHEF_SERVER_URL
|
|
11
|
+
class_option :run_as, type: :string, desc: DESC_RUN_AS
|
|
12
|
+
class_option :key_path, type: :string, desc: DESC_PRIVATE_KEY
|
|
13
|
+
|
|
14
|
+
# Parameters passed in from cli will take precedence
|
|
15
|
+
def chef_rest
|
|
16
|
+
Chef::REST.new(options[:server_url] || Config.options[:server_url],
|
|
17
|
+
options[:run_as] || Config.options[:run_as],
|
|
18
|
+
options[:key_path] || Config.options[:key_path])
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
data/lib/ogre/config.rb
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
|
|
3
|
+
# This is a simple class that puts options from a config file
|
|
4
|
+
# into an accessible object
|
|
5
|
+
module Ogre
|
|
6
|
+
# ogre home
|
|
7
|
+
OGRE_HOME = "#{ENV['HOME']}/.ogre"
|
|
8
|
+
# config path
|
|
9
|
+
CONFIG_PATH = "#{OGRE_HOME}/config.json"
|
|
10
|
+
|
|
11
|
+
# Static method to make config parameters available
|
|
12
|
+
class Config
|
|
13
|
+
# Read in defaults from config file
|
|
14
|
+
def self.options
|
|
15
|
+
(JSON.parse(File.read(CONFIG_PATH), symbolize_names: true) if File.exist?(CONFIG_PATH)) || {}
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
|
|
2
|
+
# string constants for interactive messages
|
|
3
|
+
module Ogre
|
|
4
|
+
# version
|
|
5
|
+
DESC_VERSION = 'Display gem version'
|
|
6
|
+
|
|
7
|
+
# org create description
|
|
8
|
+
DESC_CREATE = 'Create an organization in Chef'
|
|
9
|
+
|
|
10
|
+
# org delete description
|
|
11
|
+
DESC_DELETE = 'Delete an organization in Chef'
|
|
12
|
+
|
|
13
|
+
# org short name
|
|
14
|
+
DESC_ORG = 'Organization short name'
|
|
15
|
+
|
|
16
|
+
# org description
|
|
17
|
+
DESC_ORG_DESC = 'Organization long name'
|
|
18
|
+
|
|
19
|
+
# private key path
|
|
20
|
+
DESC_PRIVATE_KEY = 'Path to private key file'
|
|
21
|
+
|
|
22
|
+
# chef server url
|
|
23
|
+
DESC_CHEF_SERVER_URL = 'Chef Server URL i.e. https://chef.server.domain'
|
|
24
|
+
|
|
25
|
+
# associate description
|
|
26
|
+
DESC_ASSOCIATE_USERS = 'Associate users to an organization'
|
|
27
|
+
|
|
28
|
+
# user description
|
|
29
|
+
DESC_USER = 'User name'
|
|
30
|
+
|
|
31
|
+
# associate to admin group description
|
|
32
|
+
DESC_ASSOCIATE_ADMIN = 'Add user to admin group within organization'
|
|
33
|
+
|
|
34
|
+
# chef policy repository license
|
|
35
|
+
DESC_REPO_LICENSE = 'Chef policy repository license'
|
|
36
|
+
|
|
37
|
+
# chef policy repository authors
|
|
38
|
+
DESC_REPO_AUTHORS = 'Chef policy repository authors'
|
|
39
|
+
|
|
40
|
+
# chef policy repository path
|
|
41
|
+
DESC_REPO_PATH = 'Chef policy repository path'
|
|
42
|
+
|
|
43
|
+
# chef policy repository e-mail
|
|
44
|
+
DESC_REPO_EMAIL = 'Chef policy repository e-mail'
|
|
45
|
+
|
|
46
|
+
# create Chef policy repository
|
|
47
|
+
DESC_CREATE_REPO = 'Create Chef policy repository'
|
|
48
|
+
|
|
49
|
+
# delete without confirmation
|
|
50
|
+
DESC_FORCE = 'Delete without confirmation'
|
|
51
|
+
|
|
52
|
+
# create new chef user
|
|
53
|
+
DESC_CREATE_USER = 'Create new chef user'
|
|
54
|
+
|
|
55
|
+
# Delete and disassociate chef user
|
|
56
|
+
DESC_DELETE_USER = 'Delete and disassociate chef user'
|
|
57
|
+
|
|
58
|
+
# chef run as user
|
|
59
|
+
DESC_RUN_AS = 'Chef user'
|
|
60
|
+
|
|
61
|
+
# vCenter Orchestrator URL
|
|
62
|
+
DESC_VCO_URL = 'vCenter Orchestrator URL'
|
|
63
|
+
|
|
64
|
+
# vCenter Orchestrator user
|
|
65
|
+
DESC_VCO_USER = 'vCenter Orchestrator user'
|
|
66
|
+
|
|
67
|
+
# vCenter Orchestrator password
|
|
68
|
+
DESC_VCO_PASSWORD = 'vCenter Orchestrator password'
|
|
69
|
+
|
|
70
|
+
# vCenter Orchestrator workflow name
|
|
71
|
+
DESC_VCO_WF_NAME = 'vCenter Orchestrator workflow name'
|
|
72
|
+
|
|
73
|
+
# Set chef validation key for VCO
|
|
74
|
+
DESC_SET_PRIVATE_KEY = 'Set chef validation key for VCO'
|
|
75
|
+
|
|
76
|
+
# Chef hostname
|
|
77
|
+
DESC_CHEF_HOSTNAME = 'Chef hostname'
|
|
78
|
+
|
|
79
|
+
# Chef validator username
|
|
80
|
+
DESC_CHEF_VALIDATOR = 'Chef validator user name'
|
|
81
|
+
|
|
82
|
+
# vCenter verify ssl param
|
|
83
|
+
DESC_VCO_VERIFY_SSL = 'vCenter Orchestrator verify ssl'
|
|
84
|
+
end
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
require 'chef-dk/command/generator_commands/repo'
|
|
2
|
+
|
|
3
|
+
module Ogre
|
|
4
|
+
# Create organization through Chef::REST with the option to create the
|
|
5
|
+
# Chef policy repository
|
|
6
|
+
class OrgCreate < Ogre::Base
|
|
7
|
+
# rubocop:disable CyclomaticComplexity, PerceivedComplexity
|
|
8
|
+
# required parameters
|
|
9
|
+
argument :org, type: :string, desc: DESC_ORG
|
|
10
|
+
argument :org_desc, type: :string, desc: DESC_ORG_DESC
|
|
11
|
+
|
|
12
|
+
# optional chef policy repo parameters
|
|
13
|
+
class_option :create_repo, aliases: '-p', type: :boolean, default: false, desc: DESC_CREATE_REPO
|
|
14
|
+
class_option :repo_path, aliases: '-P', type: :string, desc: DESC_REPO_PATH
|
|
15
|
+
class_option :license, aliases: '-I', default: 'apache2', type: :string, desc: DESC_REPO_LICENSE
|
|
16
|
+
class_option :email, aliases: '-m', type: :string, desc: DESC_REPO_EMAIL
|
|
17
|
+
class_option :authors, aliases: '-C', type: :string, desc: DESC_REPO_AUTHORS
|
|
18
|
+
|
|
19
|
+
# organization create method
|
|
20
|
+
def org_create
|
|
21
|
+
org_json = { name: "#{org}", full_name: "#{org_desc}" }
|
|
22
|
+
response = chef_rest.post_rest('/organizations', org_json)
|
|
23
|
+
puts "'#{org}' org has been created."
|
|
24
|
+
|
|
25
|
+
# use chef repo generate to create a chef policy repo
|
|
26
|
+
if options[:create_repo]
|
|
27
|
+
|
|
28
|
+
# create parent dir for chef policy repo
|
|
29
|
+
repo_path = options[:repo_path] ? options[:repo_path] : OGRE_HOME
|
|
30
|
+
Dir.mkdir repo_path unless File.exist?(repo_path)
|
|
31
|
+
|
|
32
|
+
# run cookbook generate
|
|
33
|
+
generate_cmd = ChefDK::Command::GeneratorCommands::Repo.new(generate_params(repo_path))
|
|
34
|
+
generate_cmd.run
|
|
35
|
+
|
|
36
|
+
File.open("#{repo_path}/#{org}-chef/.chef/#{response['clientname']}.pem", 'w') do |f|
|
|
37
|
+
f.print(response['private_key'])
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
else
|
|
41
|
+
puts response['private_key']
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
rescue Net::HTTPServerException => e
|
|
45
|
+
|
|
46
|
+
# already exists -- i will allow it
|
|
47
|
+
if e.response.code == '409'
|
|
48
|
+
puts "#{org} org already exists"
|
|
49
|
+
else
|
|
50
|
+
raise e
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
private
|
|
55
|
+
|
|
56
|
+
# concatenate parameters into a format ChefDK::Command::GeneratorCommands::Repo will accept
|
|
57
|
+
def generate_params(parent_path)
|
|
58
|
+
# chef policy repository parameters
|
|
59
|
+
generate_str = ["#{parent_path}/#{org}-chef"]
|
|
60
|
+
|
|
61
|
+
# org name
|
|
62
|
+
generate_str << '-a'
|
|
63
|
+
generate_str << "org=#{org}"
|
|
64
|
+
|
|
65
|
+
# chef server url
|
|
66
|
+
generate_str << '-a'
|
|
67
|
+
generate_str << "chef_server_url=#{options[:server_url] || Config.options[:server_url]}"
|
|
68
|
+
|
|
69
|
+
# generator skeleton
|
|
70
|
+
generate_str << '-g'
|
|
71
|
+
generate_str << 'lib/ogre/skeletons/code_generator'
|
|
72
|
+
|
|
73
|
+
# optional license
|
|
74
|
+
if options[:license]
|
|
75
|
+
generate_str << '-I'
|
|
76
|
+
generate_str << "#{options[:license]}"
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# optional email
|
|
80
|
+
if options[:email]
|
|
81
|
+
generate_str << '-m'
|
|
82
|
+
generate_str << "#{options[:email]}"
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# optional authors
|
|
86
|
+
if options[:authors]
|
|
87
|
+
generate_str << '-C'
|
|
88
|
+
generate_str << "\"#{options[:authors]}\""
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
generate_str
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# rubocop:enable CyclomaticComplexity, PerceivedComplexity
|