knife-opc 0.3.2 → 0.4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 3257cb3b536d35a41ec3fccb5c73162012fa9953
4
- data.tar.gz: a439aff11ffa9bde8fe771cc4d39800875c26ae0
2
+ SHA256:
3
+ metadata.gz: b3a53e5648286443bac177c18abd99f1fab7c2859e6536c5513a48ca8cc50b84
4
+ data.tar.gz: eac1bd7ce2e7cd8e18bd4ee29d5d151f89ebe9a2f2b8364f1d5a49e9cfec034a
5
5
  SHA512:
6
- metadata.gz: 3195effbdcb420a5a81d75dcbdede8345174b733e0b6a8cfe0e71cded805592b5c941a09848d4cbbf09e0429128a42702949b9ef1b25901f5184c00ac698a1c2
7
- data.tar.gz: df351c0d42dadc75f675121a6e39bb4da13a5e7abca00dd0392f2aae521300f5959549ad8d10ef69321777397050349ac164c6cf29f664d9993b4e76059dc91a
6
+ metadata.gz: 2fe3ab2ac4123cc30e7bdf06035c0cd8fa7d3d1bf24efb971135f54c1e887940b81d76a39596cfe703739d857ae549a2dbca05630586ea56256d6baf0936553f
7
+ data.tar.gz: 58648d6287565e3b145d7e34224d9873d2199ed2e6d1310e07b5baf5d71bb957662d9266dbcf0f02fc1e7ddf242861519498d4e82b01e3094ece058ef3d2d823
@@ -1,6 +1,6 @@
1
1
  #
2
- # Author:: Steven Danna (<steve@opscode.com>)
3
- # Copyright:: Copyright 2011 Opscode, Inc.
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");
@@ -18,24 +18,24 @@
18
18
 
19
19
  module Opc
20
20
  class OpcOrgCreate < Chef::Knife
21
- category "OPSCODE PRIVATE CHEF ORGANIZATION MANAGEMENT"
21
+ category "CHEF ORGANIZATION MANAGEMENT"
22
22
  banner "knife opc org create ORG_SHORT_NAME ORG_FULL_NAME (options)"
23
23
 
24
24
  option :filename,
25
- :long => '--filename FILENAME',
26
- :short => '-f FILENAME',
27
- :description => 'Write validator private key to FILENAME rather than STDOUT'
25
+ long: "--filename FILENAME",
26
+ short: "-f FILENAME",
27
+ description: "Write validator private key to FILENAME rather than STDOUT"
28
28
 
29
29
  option :association_user,
30
- :long => '--association_user USERNAME',
31
- :short => '-a USERNAME',
32
- :description => 'Invite USERNAME to the new organization after creation'
30
+ long: "--association_user USERNAME",
31
+ short: "-a USERNAME",
32
+ description: "Invite USERNAME to the new organization after creation"
33
33
 
34
34
  attr_accessor :org_name, :org_full_name
35
35
 
36
36
  deps do
37
- require 'chef/org'
38
- require 'chef/org/group_operations'
37
+ require_relative "../org"
38
+ require_relative "../org/group_operations"
39
39
  end
40
40
 
41
41
  def run
@@ -47,8 +47,8 @@ module Opc
47
47
  exit 1
48
48
  end
49
49
 
50
- org = Chef::Org.from_hash({ 'name' => org_name,
51
- 'full_name' => org_full_name}).create
50
+ org = Chef::Org.from_hash({ "name" => org_name,
51
+ "full_name" => org_full_name }).create
52
52
  if config[:filename]
53
53
  File.open(config[:filename], "w") do |f|
54
54
  f.print(org.private_key)
@@ -59,8 +59,8 @@ module Opc
59
59
 
60
60
  if config[:association_user]
61
61
  org.associate_user(config[:association_user])
62
- org.add_user_to_group('admins', config[:association_user])
63
- org.add_user_to_group('billing-admins', config[:association_user])
62
+ org.add_user_to_group("admins", config[:association_user])
63
+ org.add_user_to_group("billing-admins", config[:association_user])
64
64
  end
65
65
  end
66
66
  end
@@ -1,6 +1,6 @@
1
1
  #
2
- # Author:: Steven Danna (<steve@opscode.com>)
3
- # Copyright:: Copyright 2011 Opscode, Inc.
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,11 +15,11 @@
15
15
  # See the License for the specific language governing permissions and
16
16
  # limitations under the License.
17
17
  #
18
- require 'chef/mixin/root_rest'
18
+ require_relative "../mixin/root_rest"
19
19
 
20
20
  module Opc
21
21
  class OpcOrgDelete < Chef::Knife
22
- category "OPSCODE PRIVATE CHEF ORGANIZATION MANAGEMENT"
22
+ category "CHEF ORGANIZATION MANAGEMENT"
23
23
  banner "knife opc org delete ORG_NAME"
24
24
 
25
25
  include Chef::Mixin::RootRestv0
@@ -1,6 +1,6 @@
1
1
  #
2
- # Author:: Steven Danna (<steve@opscode.com>)
3
- # Copyright:: Copyright 2011 Opscode, Inc.
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,11 +15,11 @@
15
15
  # See the License for the specific language governing permissions and
16
16
  # limitations under the License.
17
17
  #
18
- require 'chef/mixin/root_rest'
18
+ require_relative "../mixin/root_rest"
19
19
 
20
20
  module Opc
21
21
  class OpcOrgEdit < Chef::Knife
22
- category "OPSCODE PRIVATE CHEF ORGANIZATION MANAGEMENT"
22
+ category "CHEF ORGANIZATION MANAGEMENT"
23
23
  banner "knife opc org edit ORG"
24
24
 
25
25
  def run
@@ -33,7 +33,7 @@ module Opc
33
33
 
34
34
  include Chef::Mixin::RootRestv0
35
35
 
36
- original_org = root_rest.get("organizations/#{org_name}")
36
+ original_org = root_rest.get("organizations/#{org_name}")
37
37
  edited_org = edit_data(original_org)
38
38
 
39
39
  if original_org == edited_org
@@ -1,6 +1,6 @@
1
1
  #
2
- # Author:: Steven Danna (<steve@opscode.com>)
3
- # Copyright:: Copyright 2011 Opscode, Inc.
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,29 +15,29 @@
15
15
  # See the License for the specific language governing permissions and
16
16
  # limitations under the License.
17
17
  #
18
- require 'chef/mixin/root_rest'
18
+ require_relative "../mixin/root_rest"
19
19
 
20
20
  module Opc
21
21
  class OpcOrgList < Chef::Knife
22
- category "OPSCODE PRIVATE CHEF ORGANIZATION MANAGEMENT"
22
+ category "CHEF ORGANIZATION MANAGEMENT"
23
23
  banner "knife opc org list"
24
24
 
25
25
  option :with_uri,
26
- :long => "--with-uri",
27
- :short => "-w",
28
- :description => "Show corresponding URIs"
26
+ long: "--with-uri",
27
+ short: "-w",
28
+ description: "Show corresponding URIs"
29
29
 
30
30
  option :all_orgs,
31
- :long => "--all-orgs",
32
- :short => "-a",
33
- :description => "Show auto-generated hidden orgs in output"
31
+ long: "--all-orgs",
32
+ short: "-a",
33
+ description: "Show auto-generated hidden orgs in output"
34
34
 
35
35
  include Chef::Mixin::RootRestv0
36
36
 
37
37
  def run
38
- results = root_rest.get("organizations")
38
+ results = root_rest.get("organizations")
39
39
  unless config[:all_orgs]
40
- results = results.select { |k,v| !(k.length == 20 && k =~ /^[a-z]+$/) }
40
+ results = results.select { |k, v| !(k.length == 20 && k =~ /^[a-z]+$/) }
41
41
  end
42
42
  ui.output(ui.format_list_for_display(results))
43
43
  end
@@ -1,6 +1,6 @@
1
1
  #
2
- # Author:: Steven Danna (<steve@opscode.com>)
3
- # Copyright:: Copyright 2011 Opscode, Inc.
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,11 +15,11 @@
15
15
  # See the License for the specific language governing permissions and
16
16
  # limitations under the License.
17
17
  #
18
- require 'chef/mixin/root_rest'
18
+ require_relative "../mixin/root_rest"
19
19
 
20
20
  module Opc
21
21
  class OpcOrgShow < Chef::Knife
22
- category "OPSCODE PRIVATE CHEF ORGANIZATION MANAGEMENT"
22
+ category "CHEF ORGANIZATION MANAGEMENT"
23
23
  banner "knife opc org show ORGNAME"
24
24
 
25
25
  include Chef::Mixin::RootRestv0
@@ -1,6 +1,6 @@
1
1
  #
2
- # Author:: Marc Paradise (<marc@getchef.com>)
3
- # Copyright:: Copyright 2014 Chef Software, Inc
2
+ # Author:: Marc Paradise (<marc@chef.io>)
3
+ # Copyright:: Copyright 2014-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");
@@ -18,18 +18,18 @@
18
18
 
19
19
  module Opc
20
20
  class OpcOrgUserAdd < Chef::Knife
21
- category "OPSCODE PRIVATE CHEF ORGANIZATION MANAGEMENT"
21
+ category "CHEF ORGANIZATION MANAGEMENT"
22
22
  banner "knife opc org user add ORG_NAME USER_NAME"
23
23
  attr_accessor :org_name, :username
24
24
 
25
25
  option :admin,
26
- :long => '--admin',
27
- :short => '-a',
28
- :description => 'Add user to admin group'
26
+ long: "--admin",
27
+ short: "-a",
28
+ description: "Add user to admin group"
29
29
 
30
30
  deps do
31
- require 'chef/org'
32
- require 'chef/org/group_operations'
31
+ require_relative "../org"
32
+ require_relative "../org/group_operations"
33
33
  end
34
34
 
35
35
  def run
@@ -52,8 +52,9 @@ module Opc
52
52
  end
53
53
  end
54
54
  if config[:admin]
55
- org.add_user_to_group('admins', @username)
56
- org.add_user_to_group('billing-admins', @username)
55
+ org.add_user_to_group("admins", @username)
56
+ org.add_user_to_group("billing-admins", @username)
57
+ ui.msg "User #{username} is added to admins and billing-admins group"
57
58
  end
58
59
  end
59
60
  end
@@ -1,6 +1,6 @@
1
1
  #
2
2
  # Author:: Marc Paradise (<marc@getchef.com>)
3
- # Copyright:: Copyright 2014 Chef Software, Inc
3
+ # Copyright:: Copyright 2014-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");
@@ -18,12 +18,19 @@
18
18
 
19
19
  module Opc
20
20
  class OpcOrgUserRemove < Chef::Knife
21
- category "OPSCODE PRIVATE CHEF ORGANIZATION MANAGEMENT"
21
+ category "CHEF ORGANIZATION MANAGEMENT"
22
22
  banner "knife opc org user remove ORG_NAME USER_NAME"
23
23
  attr_accessor :org_name, :username
24
24
 
25
+ option :force_remove_from_admins,
26
+ long: "--force",
27
+ short: "-f",
28
+ description: "Force removal of user from the organization's admins and billing-admins group."
29
+
25
30
  deps do
26
- require 'chef/org'
31
+ require_relative "../org"
32
+ require_relative "../org/group_operations"
33
+ require "chef/json_compat"
27
34
  end
28
35
 
29
36
  def run
@@ -36,16 +43,61 @@ module Opc
36
43
  end
37
44
 
38
45
  org = Chef::Org.new(@org_name)
46
+
47
+ if config[:force_remove_from_admins]
48
+ if org.actor_delete_would_leave_admins_empty?
49
+ failure_error_message(org_name, username)
50
+ ui.msg <<~EOF
51
+ You ran with --force which force removes the user from the admins and billing-admins groups.
52
+ However, removing #{username} from the admins group would leave it empty, which breaks the org.
53
+ Please add another user to org #{org_name} admins group and try again.
54
+ EOF
55
+ exit 1
56
+ end
57
+ remove_user_from_admin_group(org, org_name, username, "admins")
58
+ remove_user_from_admin_group(org, org_name, username, "billing-admins")
59
+ end
60
+
39
61
  begin
40
62
  org.dissociate_user(@username)
41
63
  rescue Net::HTTPServerException => e
42
64
  if e.response.code == "404"
43
65
  ui.msg "User #{username} is not associated with organization #{org_name}"
44
66
  exit 1
67
+ elsif e.response.code == "403"
68
+ body = Chef::JSONCompat.from_json(e.response.body)
69
+ if body.key?("error") && body["error"] == "Please remove #{username} from this organization's admins group before removing him or her from the organization."
70
+ failure_error_message(org_name, username)
71
+ ui.msg <<~EOF
72
+ User #{username} is in the organization's admin group. Removing users from an organization without removing them from the admins group is not allowed.
73
+ Re-run this command with --force to remove this user from the admins prior to removing it from the organization.
74
+ EOF
75
+ exit 1
76
+ else
77
+ raise e
78
+ end
45
79
  else
46
80
  raise e
47
81
  end
48
82
  end
49
83
  end
84
+
85
+ def failure_error_message(org_name, username)
86
+ ui.error "Error removing user #{username} from organization #{org_name}."
87
+ end
88
+
89
+ def remove_user_from_admin_group(org, org_name, username, admin_group_string)
90
+ org.remove_user_from_group(admin_group_string, username)
91
+ rescue Net::HTTPServerException => e
92
+ if e.response.code == "404"
93
+ ui.warn <<~EOF
94
+ User #{username} is not in the #{admin_group_string} group for organization #{org_name}.
95
+ You probably don't need to pass --force.
96
+ EOF
97
+ else
98
+ raise e
99
+ end
100
+ end
101
+
50
102
  end
51
103
  end
@@ -1,6 +1,6 @@
1
1
  #
2
- # Author:: Steven Danna (<steve@opscode.com>)
3
- # Copyright:: Copyright 2011 Opscode, Inc.
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,22 +15,27 @@
15
15
  # See the License for the specific language governing permissions and
16
16
  # limitations under the License.
17
17
  #
18
- require 'chef/mixin/root_rest'
18
+ require_relative "../mixin/root_rest"
19
19
 
20
20
  module Opc
21
21
  class OpcUserCreate < Chef::Knife
22
- category "OPSCODE PRIVATE CHEF ORGANIZATION MANAGEMENT"
22
+ category "CHEF ORGANIZATION MANAGEMENT"
23
23
  banner "knife opc user create USERNAME FIRST_NAME [MIDDLE_NAME] LAST_NAME EMAIL PASSWORD"
24
24
 
25
25
  option :filename,
26
- :long => '--filename FILENAME',
27
- :short => '-f FILENAME',
28
- :description => 'Write private key to FILENAME rather than STDOUT'
26
+ long: "--filename FILENAME",
27
+ short: "-f FILENAME",
28
+ description: "Write private key to FILENAME rather than STDOUT"
29
29
 
30
30
  option :orgname,
31
- :long => '--orgname ORGNAME',
32
- :short => '-o ORGNAME',
33
- :description => 'Associate new user to an organization matching ORGNAME'
31
+ long: "--orgname ORGNAME",
32
+ short: "-o ORGNAME",
33
+ description: "Associate new user to an organization matching ORGNAME"
34
+
35
+ option :passwordprompt,
36
+ long: "--prompt-for-password",
37
+ short: "-p",
38
+ description: "Prompt for user password"
34
39
 
35
40
  include Chef::Mixin::RootRestv0
36
41
 
@@ -40,46 +45,57 @@ module Opc
40
45
  username, first_name, middle_name, last_name, email, password = @name_args
41
46
  when 5
42
47
  username, first_name, last_name, email, password = @name_args
48
+ when 4
49
+ username, first_name, last_name, email = @name_args
43
50
  else
44
51
  ui.fatal "Wrong number of arguments"
45
52
  show_usage
46
53
  exit 1
47
54
  end
55
+ password = prompt_for_password if config[:passwordprompt]
56
+ unless password
57
+ ui.fatal "You must either provide a password or use the --prompt-for-password (-p) option"
58
+ exit 1
59
+ end
48
60
  middle_name ||= ""
49
61
 
50
62
  user_hash = {
51
- :username => username,
52
- :first_name => first_name,
53
- :middle_name => middle_name,
54
- :last_name => last_name,
55
- :display_name => "#{first_name} #{last_name}",
56
- :email => email,
57
- :password => password
63
+ username: username,
64
+ first_name: first_name,
65
+ middle_name: middle_name,
66
+ last_name: last_name,
67
+ display_name: "#{first_name} #{last_name}",
68
+ email: email,
69
+ password: password,
58
70
  }
59
71
 
60
- # Check the file before creating the user so the api is more transactional.
61
- if config[:filename]
62
- file = config[:filename]
63
- unless File.exists?(file) ? File.writable?(file) : File.writable?(File.dirname(file))
64
- ui.fatal "File #{config[:filename]} is not writable. Check permissions."
65
- exit 1
66
- end
67
- end
72
+ # Check the file before creating the user so the api is more transactional.
73
+ if config[:filename]
74
+ file = config[:filename]
75
+ unless File.exist?(file) ? File.writable?(file) : File.writable?(File.dirname(file))
76
+ ui.fatal "File #{config[:filename]} is not writable. Check permissions."
77
+ exit 1
78
+ end
79
+ end
68
80
 
69
81
  result = root_rest.post("users/", user_hash)
70
82
  if config[:filename]
71
83
  File.open(config[:filename], "w") do |f|
72
- f.print(result['private_key'])
84
+ f.print(result["private_key"])
73
85
  end
74
86
  else
75
- ui.msg result['private_key']
87
+ ui.msg result["private_key"]
76
88
  end
77
89
  if config[:orgname]
78
- request_body = {:user => username}
90
+ request_body = { user: username }
79
91
  response = root_rest.post("organizations/#{config[:orgname]}/association_requests", request_body)
80
92
  association_id = response["uri"].split("/").last
81
- root_rest.put("users/#{username}/association_requests/#{association_id}", {:response => 'accept'})
93
+ root_rest.put("users/#{username}/association_requests/#{association_id}", { response: "accept" })
82
94
  end
83
95
  end
96
+
97
+ def prompt_for_password
98
+ ui.ask("Please enter the user's password: ") { |q| q.echo = false }
99
+ end
84
100
  end
85
101
  end