class Kontena::StacksClient

Constants

ACCEPT_JSON
ACCEPT_JSONAPI
ACCEPT_YAML
CT_JSONAPI
CT_YAML

Public Instance Methods

create(stack_name, is_private: true) click to toggle source
# File lib/kontena/stacks_client.rb, line 130
def create(stack_name, is_private: true)
  post(
    '/v2/stacks',
    stack_data(stack_name, is_private: is_private),
    {},
    CT_JSONAPI.merge(ACCEPT_JSONAPI)
  )
end
destroy(stack_name) click to toggle source
# File lib/kontena/stacks_client.rb, line 105
def destroy(stack_name)
  raise_unless_token
  if stack_name.version
    id = stack_version_id(stack_name)
    if id.nil?
      raise Kontena::Errors::StandardError.new(404, 'Not found')
    end
    delete('/v2/stack-versions/%s' % id, nil, {}, ACCEPT_JSONAPI)
  else
    id = stack_id(stack_name)
    if id.nil?
      raise Kontena::Errors::StandardError.new(404, 'Not found')
    end
    delete('/v2/stacks/%s' % id, nil, {}, ACCEPT_JSONAPI)
  end
end
full_uri(stack_name) click to toggle source
# File lib/kontena/stacks_client.rb, line 25
def full_uri(stack_name)
  URI.join(api_url, path_to_version(stack_name)).to_s
end
make_private(stack_name) click to toggle source
# File lib/kontena/stacks_client.rb, line 122
def make_private(stack_name)
  change_visibility(stack_name, is_private: true)
end
make_public(stack_name) click to toggle source
# File lib/kontena/stacks_client.rb, line 126
def make_public(stack_name)
  change_visibility(stack_name, is_private: false)
end
path_to_stack(stack_name) click to toggle source
# File lib/kontena/stacks_client.rb, line 33
def path_to_stack(stack_name)
  "/v2/organizations/%s/stacks/%s" % [stack_name.user, stack_name.stack]
end
path_to_version(stack_name) click to toggle source
# File lib/kontena/stacks_client.rb, line 29
def path_to_version(stack_name)
  path_to_stack(stack_name) + "/stack-versions/%s" % (stack_name.version || 'latest')
end
pull(stack_name) click to toggle source
# File lib/kontena/stacks_client.rb, line 72
def pull(stack_name)
  raise_unless_read_token
  get(path_to_version(stack_name) + '/yaml', nil, ACCEPT_YAML)
rescue StandardError => ex
  ex.message << " : #{path_to_version(stack_name)}"
  raise ex, ex.message
end
push(stack_name, data) click to toggle source
# File lib/kontena/stacks_client.rb, line 37
def push(stack_name, data)
  raise_unless_token
  post(
    '/v2/stack-files',
    {
      'data' => {
        'type' => 'stack-files',
        'attributes' => { 'content' => data }
      }
    },
    {},
    CT_JSONAPI,
    true
  )
end
raise_unless_read_token() click to toggle source
# File lib/kontena/stacks_client.rb, line 18
def raise_unless_read_token
  return false unless options[:read_requires_token]
  unless token && token['access_token']
    raise Kontena::Errors::StandardError.new(401, "Stack registry requires authentication")
  end
end
raise_unless_token() click to toggle source
# File lib/kontena/stacks_client.rb, line 12
def raise_unless_token
  unless token && token['access_token']
    raise Kontena::Errors::StandardError.new(401, "Stack registry write operations require authentication")
  end
end
show(stack_name, include_prerelease: true) click to toggle source
# File lib/kontena/stacks_client.rb, line 53
def show(stack_name, include_prerelease: true)
  raise_unless_read_token
  result = get("#{path_to_stack(stack_name)}", { 'include' => 'latest-version', 'include-prerelease' => include_prerelease }, ACCEPT_JSONAPI)
  if result['included']
    latest = result['included'].find { |i| i['type'] == 'stack-versions' }
    return result unless latest
    result['data']['attributes']['latest-version'] = {}
    result['data']['attributes']['latest-version']['version'] = latest['attributes']['version']
    result['data']['attributes']['latest-version']['description'] = latest['attributes']['description']
    result['data']['attributes']['latest-version']['meta'] = latest['meta']
  end
  result
end
versions(stack_name, include_prerelease: true, include_deleted: false) click to toggle source
# File lib/kontena/stacks_client.rb, line 67
def versions(stack_name, include_prerelease: true, include_deleted: false)
  raise_unless_read_token
  get("#{path_to_stack(stack_name)}/stack-versions", { 'include-prerelease' => include_prerelease, 'include-deleted' => include_deleted}, ACCEPT_JSONAPI).dig('data')
end

Private Instance Methods

change_visibility(stack_name, is_private: true) click to toggle source
# File lib/kontena/stacks_client.rb, line 154
def change_visibility(stack_name, is_private: true)
  raise_unless_token
  put(
    '/v2/stacks/%s' % stack_id(stack_name),
    stack_data(stack_name, is_private: is_private),
    {},
    CT_JSONAPI.merge(ACCEPT_JSONAPI)
  )
end
stack_data(stack_name, is_private: true) click to toggle source
# File lib/kontena/stacks_client.rb, line 164
def stack_data(stack_name, is_private: true)
  {
    data: {
      type: 'stacks',
      attributes: {
        'name' => stack_name.stack,
        'organization-id' => stack_name.user,
        'is-private' => is_private
      }
    }
  }
end
stack_id(stack_name) click to toggle source
# File lib/kontena/stacks_client.rb, line 141
def stack_id(stack_name)
  show(stack_name).dig('data', 'id')
end
stack_version_id(stack_name) click to toggle source
# File lib/kontena/stacks_client.rb, line 145
def stack_version_id(stack_name)
  version = versions(stack_name, include_prerelease: true).find { |v| v.dig('attributes', 'version') == stack_name.version }
  if version
    version['id']
  else
    nil
  end
end