diff options
Diffstat (limited to 'lib/chef_zero/endpoints/organizations_endpoint.rb')
-rw-r--r-- | lib/chef_zero/endpoints/organizations_endpoint.rb | 55 |
1 files changed, 43 insertions, 12 deletions
diff --git a/lib/chef_zero/endpoints/organizations_endpoint.rb b/lib/chef_zero/endpoints/organizations_endpoint.rb index 41bf03b..9464ae7 100644 --- a/lib/chef_zero/endpoints/organizations_endpoint.rb +++ b/lib/chef_zero/endpoints/organizations_endpoint.rb @@ -1,11 +1,14 @@ require 'ffi_yajl' require 'chef_zero/rest_base' +require 'chef_zero/chef_data/data_normalizer' require 'uuidtools' module ChefZero module Endpoints # /organizations class OrganizationsEndpoint < RestBase + DEFAULT_PUBLIC_KEY_NAME = "default" + def get(request) result = {} data_store.list(request.rest_path).each do |name| @@ -31,32 +34,60 @@ module ChefZero "guid" => UUIDTools::UUID.random_create.to_s.gsub('-', ''), "assigned_at" => Time.now.to_s }.merge(contents) + org_path = request.rest_path + [ name ] set_data(request, org_path + [ 'org' ], FFI_Yajl::Encoder.encode(org, :pretty => true)) if server.generate_real_keys? - # Create the validator client - validator_name = "#{name}-validator" - validator_path = org_path + [ 'clients', validator_name ] - private_key, public_key = server.gen_key_pair - validator = FFI_Yajl::Encoder.encode({ - 'validator' => true, - 'public_key' => public_key - }, :pretty => true) - set_data(request, validator_path, validator) + private_key = create_validator_client!(request, org_path) end - json_response(201, { - "uri" => "#{build_uri(request.base_uri, org_path)}", + "uri" => build_uri(request.base_uri, org_path), "name" => name, "org_type" => org["org_type"], "full_name" => full_name, - "clientname" => validator_name, + "clientname" => validator_name(name), "private_key" => private_key }) end end + + private + + def validator_name(org_name) + "#{org_name}-validator" + end + + def create_validator_client!(request, org_path) + name = validator_name(org_path.last) + validator_path = [ *org_path, 'clients', name ] + + private_key, public_key = server.gen_key_pair + + validator = FFI_Yajl::Encoder.encode({ + 'validator' => true, + }, :pretty => true) + + set_data(request, validator_path, validator) + + store_default_public_key!(request, name, public_key) + + private_key + end + + # Store the validator client's public key in client_keys + def store_default_public_key!(request, client_name, public_key) + path = [ "client_keys", client_name, "keys" ] + + data = FFI_Yajl::Encoder.encode( + "name" => DEFAULT_PUBLIC_KEY_NAME, + "public_key" => public_key, + "expiration_date" => "infinity" + ) + + create_data(request, path, DEFAULT_PUBLIC_KEY_NAME, data, :create_dir) + end end end end |