Class: Chef::ChefFS::FileSystem::ChefServer::ChefServerRootDir

Inherits:
BaseFSDir show all
Defined in:
lib/chef/chef_fs/file_system/chef_server/chef_server_root_dir.rb

Overview

Represents the root of a Chef server (or organization), under which nodes, roles, cookbooks, etc. can be found.

Instance Attribute Summary collapse

Attributes inherited from BaseFSObject

#name, #parent, #path

Instance Method Summary collapse

Methods inherited from BaseFSDir

#dir?, #empty?

Methods inherited from BaseFSObject

#chef_object, #child, #compare_to, #create_child, #delete, #dir?, #exists?, #read, #root, #write

Constructor Details

#initialize(root_name, chef_config, options = {}) ⇒ ChefServerRootDir

Create a new Chef server root.

Parameters

root_name

A friendly name for the root, for printing–like “remote” or “chef_central”.

chef_config

A hash with options that look suspiciously like Chef::Config, including the following keys:

:chef_server_url

The URL to the Chef server or top of the organization

:node_name

The username to authenticate to the Chef server with

:client_key

The private key for the user for authentication

:environment

The environment in which you are presently working

:repo_mode

The repository mode, :hosted_everything, :everything or :static. This determines the set of subdirectories the Chef server will offer up.

:versioned_cookbooks

whether or not to include versions in cookbook names

options

Other options:

:cookbook_version

when cookbooks are retrieved, grab this version for them.

:freeze

freeze cookbooks on upload



77
78
79
80
81
82
83
84
85
86
87
# File 'lib/chef/chef_fs/file_system/chef_server/chef_server_root_dir.rb', line 77

def initialize(root_name, chef_config, options = {})
  super("", nil)
  @chef_server_url = chef_config[:chef_server_url]
  @chef_username = chef_config[:node_name]
  @chef_private_key = chef_config[:client_key]
  @environment = chef_config[:environment]
  @repo_mode = chef_config[:repo_mode]
  @versioned_cookbooks = chef_config[:versioned_cookbooks]
  @root_name = root_name
  @cookbook_version = options[:cookbook_version] # Used in knife diff and download for server cookbook version
end

Instance Attribute Details

#chef_private_keyObject (readonly)

Returns the value of attribute chef_private_key.



91
92
93
# File 'lib/chef/chef_fs/file_system/chef_server/chef_server_root_dir.rb', line 91

def chef_private_key
  @chef_private_key
end

#chef_server_urlObject (readonly)

Returns the value of attribute chef_server_url.



89
90
91
# File 'lib/chef/chef_fs/file_system/chef_server/chef_server_root_dir.rb', line 89

def chef_server_url
  @chef_server_url
end

#chef_usernameObject (readonly)

Returns the value of attribute chef_username.



90
91
92
# File 'lib/chef/chef_fs/file_system/chef_server/chef_server_root_dir.rb', line 90

def chef_username
  @chef_username
end

#cookbook_versionObject (readonly)

Returns the value of attribute cookbook_version.



94
95
96
# File 'lib/chef/chef_fs/file_system/chef_server/chef_server_root_dir.rb', line 94

def cookbook_version
  @cookbook_version
end

#environmentObject (readonly)

Returns the value of attribute environment.



92
93
94
# File 'lib/chef/chef_fs/file_system/chef_server/chef_server_root_dir.rb', line 92

def environment
  @environment
end

#repo_modeObject (readonly)

Returns the value of attribute repo_mode.



93
94
95
# File 'lib/chef/chef_fs/file_system/chef_server/chef_server_root_dir.rb', line 93

def repo_mode
  @repo_mode
end

#versioned_cookbooksObject (readonly)

Returns the value of attribute versioned_cookbooks.



95
96
97
# File 'lib/chef/chef_fs/file_system/chef_server/chef_server_root_dir.rb', line 95

def versioned_cookbooks
  @versioned_cookbooks
end

Instance Method Details

#api_pathObject



113
114
115
# File 'lib/chef/chef_fs/file_system/chef_server/chef_server_root_dir.rb', line 113

def api_path
  ""
end

#can_have_child?(name, is_dir) ⇒ Boolean

Returns:

  • (Boolean)


121
122
123
124
# File 'lib/chef/chef_fs/file_system/chef_server/chef_server_root_dir.rb', line 121

def can_have_child?(name, is_dir)
  result = children.find { |child| child.name == name }
  result && !!result.dir? == !!is_dir
end

#chef_restObject



109
110
111
# File 'lib/chef/chef_fs/file_system/chef_server/chef_server_root_dir.rb', line 109

def chef_rest
  Chef::ServerAPI.new(chef_server_url, client_name: chef_username, signing_key_filename: chef_private_key, api_version: "0")
end

#childrenObject



142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
# File 'lib/chef/chef_fs/file_system/chef_server/chef_server_root_dir.rb', line 142

def children
  @children ||= begin
    result = [
      # /cookbooks
      versioned_cookbooks ? VersionedCookbooksDir.new("cookbooks", self) : CookbooksDir.new("cookbooks", self),
      # /data_bags
      DataBagsDir.new("data_bags", self, "data"),
      # /environments
      EnvironmentsDir.new("environments", self, nil, Chef::ChefFS::DataHandler::EnvironmentDataHandler.new),
      # /roles
      RestListDir.new("roles", self, nil, Chef::ChefFS::DataHandler::RoleDataHandler.new),
    ]
    if repo_mode == "hosted_everything"
      result += [
        # /acls
        AclsDir.new("acls", self),
        # /clients
        RestListDir.new("clients", self, nil, Chef::ChefFS::DataHandler::ClientDataHandler.new),
        # /containers
        RestListDir.new("containers", self, nil, Chef::ChefFS::DataHandler::ContainerDataHandler.new),
        # /cookbook_artifacts
        CookbookArtifactsDir.new("cookbook_artifacts", self),
        # /groups
        RestListDir.new("groups", self, nil, Chef::ChefFS::DataHandler::GroupDataHandler.new),
        # /nodes
        NodesDir.new("nodes", self, nil, Chef::ChefFS::DataHandler::NodeDataHandler.new),
        # /org.json
        OrgEntry.new("org.json", self),
        # /members.json
        OrganizationMembersEntry.new("members.json", self),
        # /invitations.json
        OrganizationInvitesEntry.new("invitations.json", self),
        # /policies
        PoliciesDir.new("policies", self, nil, Chef::ChefFS::DataHandler::PolicyDataHandler.new),
        # /policy_groups
        PolicyGroupsDir.new("policy_groups", self, nil, Chef::ChefFS::DataHandler::PolicyGroupDataHandler.new),
      ]
    elsif repo_mode != "static"
      result += [
        # /clients
        RestListDir.new("clients", self, nil, Chef::ChefFS::DataHandler::ClientDataHandler.new),
        # /nodes
        NodesDir.new("nodes", self, nil, Chef::ChefFS::DataHandler::NodeDataHandler.new),
        # /users
        RestListDir.new("users", self, nil, Chef::ChefFS::DataHandler::UserDataHandler.new),
      ]
    end
    result.sort_by(&:name)
  end
end

#fs_descriptionObject



97
98
99
# File 'lib/chef/chef_fs/file_system/chef_server/chef_server_root_dir.rb', line 97

def fs_description
  "Chef server at #{chef_server_url} (user #{chef_username}), repo_mode = #{repo_mode}"
end

#get_json(path) ⇒ Object



105
106
107
# File 'lib/chef/chef_fs/file_system/chef_server/chef_server_root_dir.rb', line 105

def get_json(path)
  chef_rest.get(path)
end

#make_child_entry(name) ⇒ Object



138
139
140
# File 'lib/chef/chef_fs/file_system/chef_server/chef_server_root_dir.rb', line 138

def make_child_entry(name)
  children.find { |child| child.name == name }
end

#orgObject



126
127
128
129
130
131
132
133
134
135
136
# File 'lib/chef/chef_fs/file_system/chef_server/chef_server_root_dir.rb', line 126

def org
  @org ||= begin
    path = Pathname.new(URI.parse(chef_server_url).path).cleanpath
    if File.dirname(path) == "/organizations"
      File.basename(path)
    else
      # In Chef 12, everything is in an org.
      "chef"
    end
  end
end

#path_for_printingObject



117
118
119
# File 'lib/chef/chef_fs/file_system/chef_server/chef_server_root_dir.rb', line 117

def path_for_printing
  "#{@root_name}/"
end

#restObject



101
102
103
# File 'lib/chef/chef_fs/file_system/chef_server/chef_server_root_dir.rb', line 101

def rest
  Chef::ServerAPI.new(chef_server_url, client_name: chef_username, signing_key_filename: chef_private_key, raw_output: true, api_version: "0")
end