class DTK::Network::Client::Command::Publish

Public Class Methods

new(module_ref, dependency_tree, options = {}) click to toggle source
# File lib/client/command/publish.rb, line 4
def initialize(module_ref, dependency_tree, options = {})
  @module_ref       = module_ref
  @dependency_tree  = dependency_tree
  @module_directory = module_ref.repo_dir
  @options          = options
  @parsed_module    = options[:parsed_module]
  @development_mode = options[:development_mode]
end
run(module_info, opts = {}) click to toggle source
# File lib/client/command/publish.rb, line 13
def self.run(module_info, opts = {})
  module_ref      = ModuleRef.new(module_info)
  dependency_tree = DependencyTree.get_or_create(module_ref, opts.merge(save_to_file: true, development_mode: opts[:development_mode]))
  new(module_ref, dependency_tree, opts).publish
end

Public Instance Methods

git_init_and_publish_to_remote(branch, repo_url) click to toggle source
# File lib/client/command/publish.rb, line 78
def git_init_and_publish_to_remote(branch, repo_url)
  git_args = Args.new({
    repo_dir:   @module_directory,
    branch:     branch,
    remote_url: repo_url
  })
  GitRepo.add_remote_and_publish(git_args)
end
publish() click to toggle source
# File lib/client/command/publish.rb, line 19
def publish
  module_info  = rest_post('modules', { name: @module_ref.name, namespace: @module_ref.namespace, return_if_exists: true, version: @module_ref.version.str_version })
  dependencies = []

  if @parsed_module
    (@parsed_module.val(:DependentModules) || []).map do |parsed_mr|
      dependencies << { 'namespace' => parsed_mr.req(:Namespace), 'module' => parsed_mr.req(:ModuleName), 'version' => parsed_mr.val(:ModuleVersion) }
    end
  end

  if @development_mode
    puts "Base module.yaml dependencies:\n#{dependencies}"
  end

  if @module_ref.version.is_semantic_version?
    publish_semantic_version(module_info, dependencies)
  else
    publish_named_version(module_info, dependencies)
  end
end
publish_named_version(module_info, dependencies) click to toggle source
# File lib/client/command/publish.rb, line 68
def publish_named_version(module_info, dependencies)
  module_id = module_info['id']
  branch    = rest_post("modules/#{module_id}/branch", { version: @module_ref.version.str_version, dependencies: dependencies.to_json })
  repo_url  = ret_codecommit_url(module_info)

  git_init_and_publish_to_remote(branch['name'], repo_url)

  rest_post("modules/update_status", { branch_id: branch['id'], status: 'published' })
end
publish_semantic_version(module_info, dependencies) click to toggle source
# File lib/client/command/publish.rb, line 40
def publish_semantic_version(module_info, dependencies)
  module_id          = module_info['id']
  module_ref_version = @module_ref.version
  branch             = rest_post("modules/#{module_id}/branch", { version: module_ref_version.str_version, dependencies: dependencies.to_json })

  published_response  = rest_post("modules/#{module_id}/publish", { version: module_ref_version.str_version })
  bucket, object_name = S3Helper.ret_s3_bucket_info(published_response)

  resource_name   = object_name.gsub('/','__')
  published_creds = published_response['publish_credentails']
  `tar -cpzf /tmp/#{resource_name} -C #{@module_directory} .`

  require 'aws-sdk-s3'
  s3_args = Args.new({
    region: 'us-east-1',
    access_key_id: published_creds['access_key_id'],
    secret_access_key: published_creds['secret_access_key'],
    session_token: published_creds['session_token']
  })
  s3 = Aws::S3::Resource.new(s3_args)

  obj = s3.bucket(bucket).object(object_name)
  obj.upload_file("/tmp/#{resource_name}")
  FileUtils.remove_entry("/tmp/#{resource_name}")

  rest_post("modules/update_status", { branch_id: branch['id'], status: 'published' })
end
ret_codecommit_url(module_info) click to toggle source
# File lib/client/command/publish.rb, line 87
def ret_codecommit_url(module_info)
  require 'open-uri'

  if clone_url_http   = module_info['meta']['aws']['codecommit']['repository_metadata']['clone_url_http']
    public_user_meta  = module_info['public_user_meta']
    codecommit_data   = public_user_meta || Session.get_codecommit_data
    service_user_name = codecommit_data['service_specific_credential']['service_user_name']
    service_password  = codecommit_data['service_specific_credential']['service_password']
    encoded_password  = URI.encode_www_form_component(service_password)

    url = nil
    if match = clone_url_http.match(/^(https:\/\/)(.*)$/)
      url = "#{match[1]}#{service_user_name}:#{encoded_password}@#{match[2]}"
    end

    url
  else
    raise "Unable to find codecommit https url"
  end
end