knife-opc 0.3.2 → 0.4.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 +5 -5
- data/README.md +71 -107
- data/lib/chef/knife/opc_org_create.rb +14 -14
- data/lib/chef/knife/opc_org_delete.rb +3 -3
- data/lib/chef/knife/opc_org_edit.rb +4 -4
- data/lib/chef/knife/opc_org_list.rb +5 -5
- data/lib/chef/knife/opc_org_show.rb +3 -3
- data/lib/chef/knife/opc_org_user_add.rb +10 -9
- data/lib/chef/knife/opc_org_user_remove.rb +54 -2
- data/lib/chef/knife/opc_user_create.rb +37 -21
- data/lib/chef/knife/opc_user_delete.rb +113 -14
- data/lib/chef/knife/opc_user_edit.rb +13 -14
- data/lib/chef/knife/opc_user_list.rb +3 -3
- data/lib/chef/knife/opc_user_password.rb +4 -5
- data/lib/chef/knife/opc_user_show.rb +6 -6
- data/lib/chef/mixin/root_rest.rb +3 -3
- data/lib/chef/org.rb +31 -33
- data/lib/chef/org/group_operations.rb +44 -4
- data/lib/knife-opc/version.rb +1 -1
- metadata +10 -66
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
|
-
# Author:: Steven Danna (<steve@
|
3
|
-
# Copyright:: Copyright 2011
|
2
|
+
# Author:: Steven Danna (<steve@chef.io>)
|
3
|
+
# Copyright:: Copyright 2011-2016 Chef Software, Inc.
|
4
4
|
# License:: Apache License, Version 2.0
|
5
5
|
#
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -15,7 +15,7 @@
|
|
15
15
|
# See the License for the specific language governing permissions and
|
16
16
|
# limitations under the License.
|
17
17
|
#
|
18
|
-
require
|
18
|
+
require "chef/mixin/root_rest"
|
19
19
|
|
20
20
|
module Opc
|
21
21
|
class OpcUserShow < Chef::Knife
|
@@ -30,10 +30,10 @@ module Opc
|
|
30
30
|
|
31
31
|
def run
|
32
32
|
user_name = @name_args[0]
|
33
|
-
results =
|
33
|
+
results = root_rest.get("users/#{user_name}")
|
34
34
|
if config[:with_orgs]
|
35
|
-
orgs =
|
36
|
-
results["organizations"] = orgs.map {|o| o[
|
35
|
+
orgs = root_rest.get("users/#{user_name}/organizations")
|
36
|
+
results["organizations"] = orgs.map { |o| o["organization"]["name"] }
|
37
37
|
end
|
38
38
|
ui.output results
|
39
39
|
end
|
data/lib/chef/mixin/root_rest.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
2
|
# Author:: Steven Danna (<steve@chef.io>)
|
3
|
-
# Copyright:: Copyright 2011 Chef Software, Inc
|
3
|
+
# Copyright:: Copyright 2011-2016 Chef Software, Inc.
|
4
4
|
# License:: Apache License, Version 2.0
|
5
5
|
#
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -15,7 +15,7 @@
|
|
15
15
|
# See the License for the specific language governing permissions and
|
16
16
|
# limitations under the License.
|
17
17
|
#
|
18
|
-
require
|
18
|
+
require "chef/server_api"
|
19
19
|
class Chef
|
20
20
|
module Mixin
|
21
21
|
module RootRestv0
|
@@ -24,7 +24,7 @@ class Chef
|
|
24
24
|
# Rather than upgrade all of this code to move to v1, the goal is to remove the
|
25
25
|
# need for this plugin. See
|
26
26
|
# https://github.com/chef/chef/issues/3517
|
27
|
-
@root_rest ||= Chef::ServerAPI.new(Chef::Config[:chef_server_root], {:api_version => "0"})
|
27
|
+
@root_rest ||= Chef::ServerAPI.new(Chef::Config[:chef_server_root], { :api_version => "0" })
|
28
28
|
end
|
29
29
|
end
|
30
30
|
end
|
data/lib/chef/org.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
1
|
+
require "chef/json_compat"
|
2
|
+
require "chef/mixin/params_validate"
|
3
|
+
require "chef/server_api"
|
4
|
+
require "chef/org/group_operations"
|
5
5
|
|
6
6
|
class Chef
|
7
7
|
class Org
|
@@ -9,9 +9,9 @@ class Chef
|
|
9
9
|
include Chef::Mixin::ParamsValidate
|
10
10
|
include Chef::Org::GroupOperations
|
11
11
|
|
12
|
-
def initialize(name=
|
12
|
+
def initialize(name = "")
|
13
13
|
@name = name
|
14
|
-
@full_name =
|
14
|
+
@full_name = ""
|
15
15
|
# The Chef API returns the private key of the validator
|
16
16
|
# client on create
|
17
17
|
@private_key = nil
|
@@ -19,25 +19,25 @@ class Chef
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def chef_rest
|
22
|
-
@chef_rest ||= Chef::
|
22
|
+
@chef_rest ||= Chef::ServerAPI.new(Chef::Config[:chef_server_root])
|
23
23
|
end
|
24
24
|
|
25
|
-
def name(arg=nil)
|
25
|
+
def name(arg = nil)
|
26
26
|
set_or_return(:name, arg,
|
27
27
|
:regex => /^[a-z0-9\-_]+$/)
|
28
28
|
end
|
29
29
|
|
30
|
-
def full_name(arg=nil)
|
30
|
+
def full_name(arg = nil)
|
31
31
|
set_or_return(:full_name,
|
32
32
|
arg, :kind_of => String)
|
33
33
|
end
|
34
34
|
|
35
|
-
def private_key(arg=nil)
|
35
|
+
def private_key(arg = nil)
|
36
36
|
set_or_return(:private_key,
|
37
37
|
arg, :kind_of => String)
|
38
38
|
end
|
39
39
|
|
40
|
-
def guid(arg=nil)
|
40
|
+
def guid(arg = nil)
|
41
41
|
set_or_return(:guid,
|
42
42
|
arg, :kind_of => String)
|
43
43
|
end
|
@@ -45,7 +45,7 @@ class Chef
|
|
45
45
|
def to_hash
|
46
46
|
result = {
|
47
47
|
"name" => @name,
|
48
|
-
"full_name" => @full_name
|
48
|
+
"full_name" => @full_name,
|
49
49
|
}
|
50
50
|
result["private_key"] = @private_key if @private_key
|
51
51
|
result["guid"] = @guid if @guid
|
@@ -57,15 +57,15 @@ class Chef
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def create
|
60
|
-
payload = {:name =>
|
60
|
+
payload = { :name => name, :full_name => full_name }
|
61
61
|
new_org = chef_rest.post_rest("organizations", payload)
|
62
|
-
Chef::Org.from_hash(
|
62
|
+
Chef::Org.from_hash(to_hash.merge(new_org))
|
63
63
|
end
|
64
64
|
|
65
65
|
def update
|
66
|
-
payload = {:name =>
|
66
|
+
payload = { :name => name, :full_name => full_name }
|
67
67
|
new_org = chef_rest.put_rest("organizations/#{name}", payload)
|
68
|
-
Chef::Org.from_hash(
|
68
|
+
Chef::Org.from_hash(to_hash.merge(new_org))
|
69
69
|
end
|
70
70
|
|
71
71
|
def destroy
|
@@ -73,22 +73,20 @@ class Chef
|
|
73
73
|
end
|
74
74
|
|
75
75
|
def save
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
raise e
|
83
|
-
end
|
76
|
+
create
|
77
|
+
rescue Net::HTTPServerException => e
|
78
|
+
if e.response.code == "409"
|
79
|
+
update
|
80
|
+
else
|
81
|
+
raise e
|
84
82
|
end
|
85
83
|
end
|
86
84
|
|
87
85
|
def associate_user(username)
|
88
|
-
request_body = {:user => username}
|
86
|
+
request_body = { :user => username }
|
89
87
|
response = chef_rest.post_rest "organizations/#{@name}/association_requests", request_body
|
90
88
|
association_id = response["uri"].split("/").last
|
91
|
-
chef_rest.put_rest "users/#{username}/association_requests/#{association_id}", { :response =>
|
89
|
+
chef_rest.put_rest "users/#{username}/association_requests/#{association_id}", { :response => "accept" }
|
92
90
|
end
|
93
91
|
|
94
92
|
def dissociate_user(username)
|
@@ -98,10 +96,10 @@ class Chef
|
|
98
96
|
# Class methods
|
99
97
|
def self.from_hash(org_hash)
|
100
98
|
org = Chef::Org.new
|
101
|
-
org.name org_hash[
|
102
|
-
org.full_name org_hash[
|
103
|
-
org.private_key org_hash[
|
104
|
-
org.guid org_hash[
|
99
|
+
org.name org_hash["name"]
|
100
|
+
org.full_name org_hash["full_name"]
|
101
|
+
org.private_key org_hash["private_key"] if org_hash.key?("private_key")
|
102
|
+
org.guid org_hash["guid"] if org_hash.key?("guid")
|
105
103
|
org
|
106
104
|
end
|
107
105
|
|
@@ -114,12 +112,12 @@ class Chef
|
|
114
112
|
end
|
115
113
|
|
116
114
|
def self.load(org_name)
|
117
|
-
response =
|
115
|
+
response = Chef::ServerAPI.new(Chef::Config[:chef_server_root]).get_rest("organizations/#{org_name}")
|
118
116
|
Chef::Org.from_hash(response)
|
119
117
|
end
|
120
118
|
|
121
|
-
def self.list(inflate=false)
|
122
|
-
orgs = Chef::
|
119
|
+
def self.list(inflate = false)
|
120
|
+
orgs = Chef::ServerAPI.new(Chef::Config[:chef_server_root]).get_rest("organizations")
|
123
121
|
if inflate
|
124
122
|
orgs.inject({}) do |org_map, (name, _url)|
|
125
123
|
org_map[name] = Chef::Org.load(name)
|
@@ -1,19 +1,59 @@
|
|
1
|
-
require
|
1
|
+
require "chef/org"
|
2
2
|
|
3
3
|
class Chef
|
4
4
|
class Org
|
5
5
|
module GroupOperations
|
6
|
+
def group(groupname)
|
7
|
+
@group ||= {}
|
8
|
+
@group[groupname] ||= chef_rest.get_rest "organizations/#{name}/groups/#{groupname}"
|
9
|
+
end
|
10
|
+
|
11
|
+
def user_member_of_group?(username, groupname)
|
12
|
+
group = group(groupname)
|
13
|
+
group["actors"].include? username
|
14
|
+
end
|
15
|
+
|
6
16
|
def add_user_to_group(groupname, username)
|
7
|
-
group =
|
17
|
+
group = group(groupname)
|
8
18
|
body_hash = {
|
9
19
|
:groupname => "#{groupname}",
|
10
20
|
:actors => {
|
11
21
|
"users" => group["actors"].concat([username]),
|
12
|
-
"groups" => group["groups"]
|
13
|
-
}
|
22
|
+
"groups" => group["groups"],
|
23
|
+
},
|
14
24
|
}
|
15
25
|
chef_rest.put_rest "organizations/#{name}/groups/#{groupname}", body_hash
|
16
26
|
end
|
27
|
+
|
28
|
+
def remove_user_from_group(groupname, username)
|
29
|
+
group = group(groupname)
|
30
|
+
group["actors"].delete(username)
|
31
|
+
body_hash = {
|
32
|
+
:groupname => "#{groupname}",
|
33
|
+
:actors => {
|
34
|
+
"users" => group["actors"],
|
35
|
+
"groups" => group["groups"],
|
36
|
+
},
|
37
|
+
}
|
38
|
+
chef_rest.put_rest "organizations/#{name}/groups/#{groupname}", body_hash
|
39
|
+
end
|
40
|
+
|
41
|
+
def actor_delete_would_leave_admins_empty?
|
42
|
+
admins = group("admins")
|
43
|
+
if admins["groups"].empty?
|
44
|
+
# exclude 'pivotal' but don't mutate the group since we're caching it
|
45
|
+
if admins["actors"].include? "pivotal"
|
46
|
+
admins["actors"].length <= 2
|
47
|
+
else
|
48
|
+
admins["actors"].length <= 1
|
49
|
+
end
|
50
|
+
else
|
51
|
+
# We don't check recursively. If the admins group contains a group,
|
52
|
+
# and the user is the only member of that group,
|
53
|
+
# we'll still turn up a 'safe to delete'.
|
54
|
+
false
|
55
|
+
end
|
56
|
+
end
|
17
57
|
end
|
18
58
|
include Chef::Org::GroupOperations
|
19
59
|
end
|
data/lib/knife-opc/version.rb
CHANGED
metadata
CHANGED
@@ -1,73 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: knife-opc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steven Danna
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
|
14
|
-
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: rspec
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: chef
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: sdoc
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
description: Knife Tools for Opscode Chef Server
|
70
|
-
email: steve@opscode.com
|
11
|
+
date: 2018-06-06 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Knife Tools for Chef Server
|
14
|
+
email: steve@chef.io
|
71
15
|
executables: []
|
72
16
|
extensions: []
|
73
17
|
extra_rdoc_files:
|
@@ -93,8 +37,9 @@ files:
|
|
93
37
|
- lib/chef/org.rb
|
94
38
|
- lib/chef/org/group_operations.rb
|
95
39
|
- lib/knife-opc/version.rb
|
96
|
-
homepage:
|
97
|
-
licenses:
|
40
|
+
homepage: https://github.com/knife-opc
|
41
|
+
licenses:
|
42
|
+
- Apache-2.0
|
98
43
|
metadata: {}
|
99
44
|
post_install_message:
|
100
45
|
rdoc_options: []
|
@@ -112,9 +57,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
112
57
|
version: '0'
|
113
58
|
requirements: []
|
114
59
|
rubyforge_project:
|
115
|
-
rubygems_version: 2.
|
60
|
+
rubygems_version: 2.7.6
|
116
61
|
signing_key:
|
117
62
|
specification_version: 4
|
118
|
-
summary: Knife Tools for
|
63
|
+
summary: Knife Tools for Chef Server
|
119
64
|
test_files: []
|
120
|
-
has_rdoc:
|