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 +5 -5
 - data/lib/chef/knife/opc_org_create.rb +15 -15
 - data/lib/chef/knife/opc_org_delete.rb +4 -4
 - data/lib/chef/knife/opc_org_edit.rb +5 -5
 - data/lib/chef/knife/opc_org_list.rb +12 -12
 - data/lib/chef/knife/opc_org_show.rb +4 -4
 - data/lib/chef/knife/opc_org_user_add.rb +11 -10
 - data/lib/chef/knife/opc_org_user_remove.rb +55 -3
 - data/lib/chef/knife/opc_user_create.rb +45 -29
 - data/lib/chef/knife/opc_user_delete.rb +114 -15
 - data/lib/chef/knife/opc_user_edit.rb +43 -19
 - data/lib/chef/knife/opc_user_list.rb +19 -9
 - data/lib/chef/knife/opc_user_password.rb +10 -11
 - data/lib/chef/knife/opc_user_show.rb +9 -9
 - data/lib/chef/mixin/root_rest.rb +3 -3
 - data/lib/chef/org.rb +35 -37
 - data/lib/chef/org/group_operations.rb +46 -6
 - data/lib/knife-opc/version.rb +1 -1
 - metadata +11 -71
 - data/README.md +0 -183
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 2 
     | 
    
         
            +
            SHA256:
         
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: b3a53e5648286443bac177c18abd99f1fab7c2859e6536c5513a48ca8cc50b84
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: eac1bd7ce2e7cd8e18bd4ee29d5d151f89ebe9a2f2b8364f1d5a49e9cfec034a
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 2fe3ab2ac4123cc30e7bdf06035c0cd8fa7d3d1bf24efb971135f54c1e887940b81d76a39596cfe703739d857ae549a2dbca05630586ea56256d6baf0936553f
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 58648d6287565e3b145d7e34224d9873d2199ed2e6d1310e07b5baf5d71bb957662d9266dbcf0f02fc1e7ddf242861519498d4e82b01e3094ece058ef3d2d823
         
     | 
| 
         @@ -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");
         
     | 
| 
         @@ -18,24 +18,24 @@ 
     | 
|
| 
       18 
18 
     | 
    
         | 
| 
       19 
19 
     | 
    
         
             
            module Opc
         
     | 
| 
       20 
20 
     | 
    
         
             
              class OpcOrgCreate < Chef::Knife
         
     | 
| 
       21 
     | 
    
         
            -
                category " 
     | 
| 
      
 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 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
      
 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 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
      
 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 
     | 
    
         
            -
                   
     | 
| 
       38 
     | 
    
         
            -
                   
     | 
| 
      
 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({  
     | 
| 
       51 
     | 
    
         
            -
                                               
     | 
| 
      
 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( 
     | 
| 
       63 
     | 
    
         
            -
                    org.add_user_to_group( 
     | 
| 
      
 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@ 
     | 
| 
       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,11 +15,11 @@ 
     | 
|
| 
       15 
15 
     | 
    
         
             
            # See the License for the specific language governing permissions and
         
     | 
| 
       16 
16 
     | 
    
         
             
            # limitations under the License.
         
     | 
| 
       17 
17 
     | 
    
         
             
            #
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
      
 18 
     | 
    
         
            +
            require_relative "../mixin/root_rest"
         
     | 
| 
       19 
19 
     | 
    
         | 
| 
       20 
20 
     | 
    
         
             
            module Opc
         
     | 
| 
       21 
21 
     | 
    
         
             
              class OpcOrgDelete < Chef::Knife
         
     | 
| 
       22 
     | 
    
         
            -
                category " 
     | 
| 
      
 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@ 
     | 
| 
       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,11 +15,11 @@ 
     | 
|
| 
       15 
15 
     | 
    
         
             
            # See the License for the specific language governing permissions and
         
     | 
| 
       16 
16 
     | 
    
         
             
            # limitations under the License.
         
     | 
| 
       17 
17 
     | 
    
         
             
            #
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
      
 18 
     | 
    
         
            +
            require_relative "../mixin/root_rest"
         
     | 
| 
       19 
19 
     | 
    
         | 
| 
       20 
20 
     | 
    
         
             
            module Opc
         
     | 
| 
       21 
21 
     | 
    
         
             
              class OpcOrgEdit < Chef::Knife
         
     | 
| 
       22 
     | 
    
         
            -
                category " 
     | 
| 
      
 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 = 
     | 
| 
      
 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@ 
     | 
| 
       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,29 +15,29 @@ 
     | 
|
| 
       15 
15 
     | 
    
         
             
            # See the License for the specific language governing permissions and
         
     | 
| 
       16 
16 
     | 
    
         
             
            # limitations under the License.
         
     | 
| 
       17 
17 
     | 
    
         
             
            #
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
      
 18 
     | 
    
         
            +
            require_relative "../mixin/root_rest"
         
     | 
| 
       19 
19 
     | 
    
         | 
| 
       20 
20 
     | 
    
         
             
            module Opc
         
     | 
| 
       21 
21 
     | 
    
         
             
              class OpcOrgList < Chef::Knife
         
     | 
| 
       22 
     | 
    
         
            -
                category " 
     | 
| 
      
 22 
     | 
    
         
            +
                category "CHEF ORGANIZATION MANAGEMENT"
         
     | 
| 
       23 
23 
     | 
    
         
             
                banner "knife opc org list"
         
     | 
| 
       24 
24 
     | 
    
         | 
| 
       25 
25 
     | 
    
         
             
                option :with_uri,
         
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
      
 26 
     | 
    
         
            +
                  long: "--with-uri",
         
     | 
| 
      
 27 
     | 
    
         
            +
                  short: "-w",
         
     | 
| 
      
 28 
     | 
    
         
            +
                  description: "Show corresponding URIs"
         
     | 
| 
       29 
29 
     | 
    
         | 
| 
       30 
30 
     | 
    
         
             
                option :all_orgs,
         
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
      
 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 = 
     | 
| 
      
 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@ 
     | 
| 
       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,11 +15,11 @@ 
     | 
|
| 
       15 
15 
     | 
    
         
             
            # See the License for the specific language governing permissions and
         
     | 
| 
       16 
16 
     | 
    
         
             
            # limitations under the License.
         
     | 
| 
       17 
17 
     | 
    
         
             
            #
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
      
 18 
     | 
    
         
            +
            require_relative "../mixin/root_rest"
         
     | 
| 
       19 
19 
     | 
    
         | 
| 
       20 
20 
     | 
    
         
             
            module Opc
         
     | 
| 
       21 
21 
     | 
    
         
             
              class OpcOrgShow < Chef::Knife
         
     | 
| 
       22 
     | 
    
         
            -
                category " 
     | 
| 
      
 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@ 
     | 
| 
       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 " 
     | 
| 
      
 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 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
      
 26 
     | 
    
         
            +
                  long: "--admin",
         
     | 
| 
      
 27 
     | 
    
         
            +
                  short: "-a",
         
     | 
| 
      
 28 
     | 
    
         
            +
                  description: "Add user to admin group"
         
     | 
| 
       29 
29 
     | 
    
         | 
| 
       30 
30 
     | 
    
         
             
                deps do
         
     | 
| 
       31 
     | 
    
         
            -
                   
     | 
| 
       32 
     | 
    
         
            -
                   
     | 
| 
      
 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( 
     | 
| 
       56 
     | 
    
         
            -
                    org.add_user_to_group( 
     | 
| 
      
 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 " 
     | 
| 
      
 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 
     | 
    
         
            -
                   
     | 
| 
      
 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@ 
     | 
| 
       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,22 +15,27 @@ 
     | 
|
| 
       15 
15 
     | 
    
         
             
            # See the License for the specific language governing permissions and
         
     | 
| 
       16 
16 
     | 
    
         
             
            # limitations under the License.
         
     | 
| 
       17 
17 
     | 
    
         
             
            #
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
      
 18 
     | 
    
         
            +
            require_relative "../mixin/root_rest"
         
     | 
| 
       19 
19 
     | 
    
         | 
| 
       20 
20 
     | 
    
         
             
            module Opc
         
     | 
| 
       21 
21 
     | 
    
         
             
              class OpcUserCreate < Chef::Knife
         
     | 
| 
       22 
     | 
    
         
            -
                category " 
     | 
| 
      
 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 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
      
 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 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
      
 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 
     | 
    
         
            -
                    : 
     | 
| 
       52 
     | 
    
         
            -
                    : 
     | 
| 
       53 
     | 
    
         
            -
                    : 
     | 
| 
       54 
     | 
    
         
            -
                    : 
     | 
| 
       55 
     | 
    
         
            -
                    : 
     | 
| 
       56 
     | 
    
         
            -
                    : 
     | 
| 
       57 
     | 
    
         
            -
                    : 
     | 
| 
      
 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 
     | 
    
         
            -
             
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
       62 
     | 
    
         
            -
             
     | 
| 
       63 
     | 
    
         
            -
             
     | 
| 
       64 
     | 
    
         
            -
             
     | 
| 
       65 
     | 
    
         
            -
             
     | 
| 
       66 
     | 
    
         
            -
             
     | 
| 
       67 
     | 
    
         
            -
             
     | 
| 
      
 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[ 
     | 
| 
      
 84 
     | 
    
         
            +
                      f.print(result["private_key"])
         
     | 
| 
       73 
85 
     | 
    
         
             
                    end
         
     | 
| 
       74 
86 
     | 
    
         
             
                  else
         
     | 
| 
       75 
     | 
    
         
            -
                    ui.msg result[ 
     | 
| 
      
 87 
     | 
    
         
            +
                    ui.msg result["private_key"]
         
     | 
| 
       76 
88 
     | 
    
         
             
                  end
         
     | 
| 
       77 
89 
     | 
    
         
             
                  if config[:orgname]
         
     | 
| 
       78 
     | 
    
         
            -
                    request_body = {: 
     | 
| 
      
 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}", {: 
     | 
| 
      
 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
         
     |