dtk-network-client 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +5 -0
- data/Gemfile +2 -0
- data/LICENSE +201 -0
- data/README.md +2 -0
- data/dtk-network-client.gemspec +24 -0
- data/lib/client/args.rb +19 -0
- data/lib/client/client_args.rb +23 -0
- data/lib/client/command/add_to_group.rb +20 -0
- data/lib/client/command/chmod.rb +21 -0
- data/lib/client/command/create_namespace.rb +19 -0
- data/lib/client/command/delete.rb +25 -0
- data/lib/client/command/delete_namespace.rb +19 -0
- data/lib/client/command/info.rb +32 -0
- data/lib/client/command/install/installer.rb +9 -0
- data/lib/client/command/install.rb +190 -0
- data/lib/client/command/list.rb +13 -0
- data/lib/client/command/list_namespaces.rb +10 -0
- data/lib/client/command/publish.rb +120 -0
- data/lib/client/command/pull.rb +53 -0
- data/lib/client/command/push.rb +63 -0
- data/lib/client/command/remove_from_group.rb +20 -0
- data/lib/client/command/unpublish.rb +27 -0
- data/lib/client/command/update.rb +18 -0
- data/lib/client/command.rb +31 -0
- data/lib/client/config.rb +54 -0
- data/lib/client/conn.rb +132 -0
- data/lib/client/dependency_tree/activated.rb +35 -0
- data/lib/client/dependency_tree/cache.rb +28 -0
- data/lib/client/dependency_tree/candidates.rb +19 -0
- data/lib/client/dependency_tree/resolver.rb +16 -0
- data/lib/client/dependency_tree.rb +272 -0
- data/lib/client/error.rb +22 -0
- data/lib/client/file_helper.rb +8 -0
- data/lib/client/git_adapter/git_gem.rb +246 -0
- data/lib/client/git_client.rb +136 -0
- data/lib/client/git_repo.rb +221 -0
- data/lib/client/module_dir.rb +38 -0
- data/lib/client/module_ref/dependency/local.rb +47 -0
- data/lib/client/module_ref/dependency/remote.rb +18 -0
- data/lib/client/module_ref/dependency.rb +21 -0
- data/lib/client/module_ref/version/source.rb +18 -0
- data/lib/client/module_ref/version.rb +87 -0
- data/lib/client/module_ref.rb +21 -0
- data/lib/client/response/response_types.rb +42 -0
- data/lib/client/response.rb +27 -0
- data/lib/client/rest_wrapper.rb +43 -0
- data/lib/client/s3_helper.rb +23 -0
- data/lib/client/session.rb +54 -0
- data/lib/client/storage/adapters/s3.rb +25 -0
- data/lib/client/storage.rb +29 -0
- data/lib/client/util/os_util.rb +77 -0
- data/lib/client/util/permissions_util.rb +12 -0
- data/lib/client/util/tar.rb +104 -0
- data/lib/client/util.rb +7 -0
- data/lib/client/version.rb +8 -0
- data/lib/dtk_network_client.rb +27 -0
- metadata +183 -0
@@ -0,0 +1,120 @@
|
|
1
|
+
module DTK::Network::Client
|
2
|
+
class Command
|
3
|
+
class Publish < self
|
4
|
+
def initialize(module_ref, dependency_tree, options = {})
|
5
|
+
@module_ref = module_ref
|
6
|
+
@dependency_tree = dependency_tree
|
7
|
+
@module_directory = module_ref.repo_dir
|
8
|
+
@options = options
|
9
|
+
@parsed_module = options[:parsed_module]
|
10
|
+
@development_mode = options[:development_mode]
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.run(module_info, opts = {})
|
14
|
+
module_ref = ModuleRef.new(module_info)
|
15
|
+
dependency_tree = DependencyTree.get_or_create(module_ref, opts.merge(save_to_file: true, development_mode: opts[:development_mode]))
|
16
|
+
new(module_ref, dependency_tree, opts).publish
|
17
|
+
end
|
18
|
+
|
19
|
+
def publish
|
20
|
+
module_info = rest_post('modules', { name: @module_ref.name, namespace: @module_ref.namespace, return_if_exists: true })
|
21
|
+
dependencies = []
|
22
|
+
|
23
|
+
if @parsed_module
|
24
|
+
(@parsed_module.val(:DependentModules) || []).map do |parsed_mr|
|
25
|
+
dependencies << { 'namespace' => parsed_mr.req(:Namespace), 'module' => parsed_mr.req(:ModuleName), 'version' => parsed_mr.val(:ModuleVersion) }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
if @development_mode
|
30
|
+
puts "Base module.yaml dependencies:\n#{dependencies}"
|
31
|
+
end
|
32
|
+
|
33
|
+
if @module_ref.version.is_semantic_version?
|
34
|
+
publish_semantic_version(module_info, dependencies)
|
35
|
+
else
|
36
|
+
publish_named_version(module_info, dependencies)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def publish_semantic_version(module_info, dependencies)
|
41
|
+
module_id = module_info['id']
|
42
|
+
module_ref_version = @module_ref.version
|
43
|
+
branch = rest_post("modules/#{module_id}/branch", { version: module_ref_version.str_version, dependencies: dependencies.to_json })
|
44
|
+
# repo_url = ret_codecommit_url(module_info)
|
45
|
+
|
46
|
+
# git_init_and_publish_to_remote(branch['name'], repo_url)
|
47
|
+
|
48
|
+
published_response = rest_post("modules/#{module_id}/publish", { version: module_ref_version.str_version })
|
49
|
+
bucket, object_name = S3Helper.ret_s3_bucket_info(published_response)
|
50
|
+
# gz_body = ModuleDir.create_and_ret_tar_gz(@module_directory, exclude_git: true)
|
51
|
+
|
52
|
+
resource_name = object_name.gsub('/','__')
|
53
|
+
published_creds = published_response['publish_credentails']
|
54
|
+
`tar -cpzf /tmp/#{resource_name} -C #{@module_directory} .`
|
55
|
+
|
56
|
+
require 'aws-sdk-s3'
|
57
|
+
s3_args = Args.new({
|
58
|
+
region: 'us-east-1',
|
59
|
+
access_key_id: published_creds['access_key_id'],
|
60
|
+
secret_access_key: published_creds['secret_access_key'],
|
61
|
+
session_token: published_creds['session_token']
|
62
|
+
})
|
63
|
+
s3 = Aws::S3::Resource.new(s3_args)
|
64
|
+
# storage = Storage.new(:s3, s3_args)
|
65
|
+
|
66
|
+
obj = s3.bucket(bucket).object(object_name)
|
67
|
+
obj.upload_file("/tmp/#{resource_name}")
|
68
|
+
FileUtils.remove_entry("/tmp/#{resource_name}")
|
69
|
+
# upload_args = Args.new({
|
70
|
+
# body: gz_body,
|
71
|
+
# bucket: bucket,
|
72
|
+
# key: object_name
|
73
|
+
# })
|
74
|
+
# storage.upload(upload_args)
|
75
|
+
|
76
|
+
rest_post("modules/update_status", { branch_id: branch['id'], status: 'published' })
|
77
|
+
end
|
78
|
+
|
79
|
+
def publish_named_version(module_info, dependencies)
|
80
|
+
module_id = module_info['id']
|
81
|
+
branch = rest_post("modules/#{module_id}/branch", { version: @module_ref.version.str_version, dependencies: dependencies.to_json })
|
82
|
+
repo_url = ret_codecommit_url(module_info)
|
83
|
+
|
84
|
+
git_init_and_publish_to_remote(branch['name'], repo_url)
|
85
|
+
|
86
|
+
rest_post("modules/update_status", { branch_id: branch['id'], status: 'published' })
|
87
|
+
end
|
88
|
+
|
89
|
+
def git_init_and_publish_to_remote(branch, repo_url)
|
90
|
+
git_args = Args.new({
|
91
|
+
repo_dir: @module_directory,
|
92
|
+
branch: branch,
|
93
|
+
remote_url: repo_url
|
94
|
+
})
|
95
|
+
GitRepo.add_remote_and_publish(git_args)
|
96
|
+
end
|
97
|
+
|
98
|
+
def ret_codecommit_url(module_info)
|
99
|
+
require 'open-uri'
|
100
|
+
|
101
|
+
if clone_url_http = module_info['meta']['aws']['codecommit']['repository_metadata']['clone_url_http']
|
102
|
+
codecommit_data = Session.get_codecommit_data
|
103
|
+
service_user_name = codecommit_data['service_specific_credential']['service_user_name']
|
104
|
+
service_password = codecommit_data['service_specific_credential']['service_password']
|
105
|
+
encoded_password = URI.encode_www_form_component(service_password)
|
106
|
+
|
107
|
+
url = nil
|
108
|
+
if match = clone_url_http.match(/^(https:\/\/)(.*)$/)
|
109
|
+
url = "#{match[1]}#{service_user_name}:#{encoded_password}@#{match[2]}"
|
110
|
+
end
|
111
|
+
|
112
|
+
url
|
113
|
+
else
|
114
|
+
raise "Unable to find codecommit https url"
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module DTK::Network::Client
|
2
|
+
class Command
|
3
|
+
class Pull < self
|
4
|
+
def initialize(module_ref, dependency_tree, options = {})
|
5
|
+
@module_ref = module_ref
|
6
|
+
@dependency_tree = dependency_tree
|
7
|
+
@module_directory = module_ref.repo_dir
|
8
|
+
@options = options
|
9
|
+
@parsed_module = options[:parsed_module]
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.run(module_info, opts = {})
|
13
|
+
module_ref = ModuleRef.new(module_info)
|
14
|
+
dependency_tree = DependencyTree.get_or_create(module_ref, opts.merge(save_to_file: true))
|
15
|
+
new(module_ref, dependency_tree, opts).pull
|
16
|
+
end
|
17
|
+
|
18
|
+
def pull
|
19
|
+
module_info = rest_get('modules/module_info', { name: @module_ref.name, namespace: @module_ref.namespace, version: @module_ref.version.str_version })
|
20
|
+
remote_url = construct_remote_url(module_info)
|
21
|
+
git_args = Args.new({
|
22
|
+
repo_dir: @module_directory,
|
23
|
+
branch: @module_ref.version.str_version,
|
24
|
+
remote_url: remote_url
|
25
|
+
})
|
26
|
+
GitRepo.pull_from_remote(git_args)
|
27
|
+
end
|
28
|
+
|
29
|
+
# TODO: move construct_remote_url to helper or mixin and use for all commands when needed
|
30
|
+
def construct_remote_url(module_info)
|
31
|
+
require 'open-uri'
|
32
|
+
|
33
|
+
# if clone_url_http = module_info.dig('meta', 'aws', 'codecommit', 'repository_metadata', 'clone_url_http')
|
34
|
+
if clone_url_http = module_info['meta']['aws']['codecommit']['repository_metadata']['clone_url_http']
|
35
|
+
codecommit_data = Session.get_codecommit_data
|
36
|
+
# service_user_name = codecommit_data.dig('service_specific_credential', 'service_user_name')
|
37
|
+
# service_password = codecommit_data.dig('service_specific_credential', 'service_password')
|
38
|
+
service_user_name = codecommit_data['service_specific_credential']['service_user_name']
|
39
|
+
service_password = codecommit_data['service_specific_credential']['service_password']
|
40
|
+
encoded_password = URI.encode_www_form_component(service_password)
|
41
|
+
url = nil
|
42
|
+
if match = clone_url_http.match(/^(https:\/\/)(.*)$/)
|
43
|
+
url = "#{match[1]}#{service_user_name}:#{encoded_password}@#{match[2]}"
|
44
|
+
end
|
45
|
+
url
|
46
|
+
else
|
47
|
+
raise "Unable to find codecommit https url"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module DTK::Network::Client
|
2
|
+
class Command
|
3
|
+
class Push < self
|
4
|
+
def initialize(module_ref, dependency_tree, options = {})
|
5
|
+
@module_ref = module_ref
|
6
|
+
@dependency_tree = dependency_tree
|
7
|
+
@module_directory = module_ref.repo_dir
|
8
|
+
@options = options
|
9
|
+
@parsed_module = options[:parsed_module]
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.run(module_info, opts = {})
|
13
|
+
module_ref = ModuleRef.new(module_info)
|
14
|
+
dependency_tree = DependencyTree.get_or_create(module_ref, opts.merge(save_to_file: true))
|
15
|
+
new(module_ref, dependency_tree, opts).push
|
16
|
+
end
|
17
|
+
|
18
|
+
def push
|
19
|
+
module_info = rest_get('modules/module_info', { name: @module_ref.name, namespace: @module_ref.namespace, version: @module_ref.version.str_version, module_action: 'push' })
|
20
|
+
remote_url = construct_remote_url(module_info)
|
21
|
+
git_args = Args.new({
|
22
|
+
repo_dir: @module_directory,
|
23
|
+
branch: @module_ref.version.str_version,
|
24
|
+
remote_url: remote_url
|
25
|
+
})
|
26
|
+
GitRepo.push_to_remote(git_args)
|
27
|
+
|
28
|
+
dependencies = []
|
29
|
+
if @parsed_module
|
30
|
+
(@parsed_module.val(:DependentModules) || []).map do |parsed_mr|
|
31
|
+
dependencies << { 'namespace' => parsed_mr.req(:Namespace), 'module' => parsed_mr.req(:ModuleName), 'version' => parsed_mr.val(:ModuleVersion) }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
rest_post("modules/#{module_info['id']}/dependencies", { version: @module_ref.version.str_version, dependencies: dependencies.to_json })
|
36
|
+
nil
|
37
|
+
end
|
38
|
+
|
39
|
+
# TODO: move construct_remote_url to helper or mixin and use for all commands when needed
|
40
|
+
def construct_remote_url(module_info)
|
41
|
+
require 'open-uri'
|
42
|
+
|
43
|
+
# if clone_url_http = module_info.dig('meta', 'aws', 'codecommit', 'repository_metadata', 'clone_url_http')
|
44
|
+
if clone_url_http = module_info['meta']['aws']['codecommit']['repository_metadata']['clone_url_http']
|
45
|
+
codecommit_data = Session.get_codecommit_data
|
46
|
+
# service_user_name = codecommit_data.dig('service_specific_credential', 'service_user_name')
|
47
|
+
service_user_name = codecommit_data['service_specific_credential']['service_user_name']
|
48
|
+
# service_password = codecommit_data.dig('service_specific_credential', 'service_password')
|
49
|
+
service_password = codecommit_data['service_specific_credential']['service_password']
|
50
|
+
encoded_password = URI.encode_www_form_component(service_password)
|
51
|
+
url = nil
|
52
|
+
if match = clone_url_http.match(/^(https:\/\/)(.*)$/)
|
53
|
+
url = "#{match[1]}#{service_user_name}:#{encoded_password}@#{match[2]}"
|
54
|
+
end
|
55
|
+
url
|
56
|
+
else
|
57
|
+
raise "Unable to find codecommit https url"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module DTK::Network::Client
|
2
|
+
class Command
|
3
|
+
class RemoveFromGroup < self
|
4
|
+
def initialize(group, user, options = {})
|
5
|
+
@group = group
|
6
|
+
@user = user
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.run(group, user, opts = {})
|
10
|
+
new(group, user, opts).revoke_access
|
11
|
+
end
|
12
|
+
|
13
|
+
def revoke_access
|
14
|
+
rest_post("groups/#{@group}/remove_member", { name: @group, username: @user })
|
15
|
+
nil
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module DTK::Network::Client
|
2
|
+
class Command
|
3
|
+
class Unpublish < self
|
4
|
+
def initialize(module_ref, options = {})
|
5
|
+
@module_ref = module_ref
|
6
|
+
@options = options
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.run(module_info, opts = {})
|
10
|
+
module_ref = ModuleRef.new(module_info)
|
11
|
+
new(module_ref, opts).unpublish
|
12
|
+
end
|
13
|
+
|
14
|
+
def unpublish
|
15
|
+
version = @module_ref.version
|
16
|
+
params = {
|
17
|
+
name: @module_ref.name,
|
18
|
+
namespace: @module_ref.namespace,
|
19
|
+
version: version.str_version
|
20
|
+
}
|
21
|
+
rest_post("modules/unpublish", params)
|
22
|
+
|
23
|
+
nil
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module DTK::Network::Client
|
2
|
+
class Command
|
3
|
+
class Update < self
|
4
|
+
def initialize(module_ref, dependency_tree, options = {})
|
5
|
+
@module_ref = module_ref
|
6
|
+
@dependency_tree = dependency_tree
|
7
|
+
@module_directory = module_ref.repo_dir
|
8
|
+
@options = options
|
9
|
+
@parsed_module = options[:parsed_module]
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.run(module_info, opts = {})
|
13
|
+
module_ref = ModuleRef.new(module_info)
|
14
|
+
DependencyTree.get_or_create(module_ref, opts.merge(save_to_file: true, update_lock_file: true))
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module DTK::Network
|
2
|
+
module Client
|
3
|
+
class Command
|
4
|
+
require_relative('command/install')
|
5
|
+
require_relative('command/publish')
|
6
|
+
require_relative('command/list')
|
7
|
+
require_relative('command/info')
|
8
|
+
require_relative('command/push')
|
9
|
+
require_relative('command/pull')
|
10
|
+
require_relative('command/add_to_group')
|
11
|
+
require_relative('command/remove_from_group')
|
12
|
+
require_relative('command/delete')
|
13
|
+
require_relative('command/create_namespace')
|
14
|
+
require_relative('command/unpublish')
|
15
|
+
require_relative('command/update')
|
16
|
+
require_relative('command/chmod')
|
17
|
+
require_relative('command/delete_namespace')
|
18
|
+
require_relative('command/list_namespaces')
|
19
|
+
|
20
|
+
include RestWrapper
|
21
|
+
extend RestWrapper
|
22
|
+
include DTK::Network::Client::Util::Tar
|
23
|
+
extend DTK::Client::PermissionsUtil
|
24
|
+
include DTK::Client::PermissionsUtil
|
25
|
+
|
26
|
+
def self.wrap_command(args = Args.new, &block)
|
27
|
+
block.call(Args.convert(args))
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module DTK::Network::Client
|
4
|
+
class Config
|
5
|
+
extend DTK::Network::Client::Util::OsUtil
|
6
|
+
|
7
|
+
DTK_NETWORK_FILE = '.dtk_network'
|
8
|
+
DTK_NETWORK_CONFIG = File.join(dtk_local_folder, DTK_NETWORK_FILE)
|
9
|
+
|
10
|
+
def self.get_credentials
|
11
|
+
raise "Dtk network config file (#{DTK_NETWORK_CONFIG}) does not exist" unless File.exists?(DTK_NETWORK_CONFIG)
|
12
|
+
ret = parse_key_value_file(DTK_NETWORK_CONFIG)
|
13
|
+
[:email, :password].each{ |k| raise "cannot find #{k}" unless ret[k] }
|
14
|
+
{
|
15
|
+
email: ret[:email],
|
16
|
+
password: ret[:password]
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.get_endpoint
|
21
|
+
raise "Dtk network config file (#{DTK_NETWORK_CONFIG}) does not exist" unless File.exists?(DTK_NETWORK_CONFIG)
|
22
|
+
ret = parse_key_value_file(DTK_NETWORK_CONFIG)
|
23
|
+
[:endpoint, :port].each{ |k| raise "cannot find #{k}" unless ret[k] }
|
24
|
+
"#{ret[:endpoint]}:#{ret[:port]}"
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.module_download_location
|
28
|
+
if File.exists?(DTK_NETWORK_CONFIG)
|
29
|
+
ret = parse_key_value_file(DTK_NETWORK_CONFIG) || {}
|
30
|
+
ret[:download_location]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.parse_key_value_file(file)
|
35
|
+
raise "Config file (#{file}) does not exists" unless File.exists?(file)
|
36
|
+
|
37
|
+
ret = Hash.new
|
38
|
+
File.open(file).each do |line|
|
39
|
+
# strip blank spaces, tabs etc off the end of all lines
|
40
|
+
line.gsub!(/\s*$/, "")
|
41
|
+
unless line =~ /^#|^$/
|
42
|
+
if (line =~ /(.+?)\s*=\s*(.+)/)
|
43
|
+
key = $1
|
44
|
+
val = $2
|
45
|
+
ret[key.to_sym] = val
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
ret
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
data/lib/client/conn.rb
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
module DTK::Network
|
2
|
+
module Client
|
3
|
+
class Conn
|
4
|
+
def initialize
|
5
|
+
@cookies = {}
|
6
|
+
@connection_error = nil
|
7
|
+
@codecommit = nil
|
8
|
+
login
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_reader :cookies, :connection_error, :codecommit
|
12
|
+
|
13
|
+
def get(route, query_string_hash = {})
|
14
|
+
check_and_wrap_response { json_parse_if_needed(get_raw(rest_url(route), query_string_hash)) }
|
15
|
+
end
|
16
|
+
|
17
|
+
def post(route, post_body = {})
|
18
|
+
check_and_wrap_response { json_parse_if_needed(post_raw(rest_url(route), post_body)) }
|
19
|
+
end
|
20
|
+
|
21
|
+
def delete(route, delete_body = {})
|
22
|
+
check_and_wrap_response { json_parse_if_needed(delete_raw(rest_url(route), delete_body)) }
|
23
|
+
end
|
24
|
+
|
25
|
+
def connection_error?
|
26
|
+
!connection_error.nil?
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def error_code?
|
32
|
+
connection_error['errors'].first['code'] rescue nil
|
33
|
+
end
|
34
|
+
|
35
|
+
REST_VERSION = 'v1'
|
36
|
+
REST_PREFIX = "api/#{REST_VERSION}"
|
37
|
+
|
38
|
+
def rest_url(route = nil)
|
39
|
+
"#{rest_url_base}/#{REST_PREFIX}/#{route}"
|
40
|
+
end
|
41
|
+
|
42
|
+
def rest_url_base
|
43
|
+
@@rest_url_base ||= Config.get_endpoint
|
44
|
+
end
|
45
|
+
|
46
|
+
def check_and_wrap_response(&rest_method_func)
|
47
|
+
if @connection_error
|
48
|
+
if conn_error = connection_error['errors'].first
|
49
|
+
raise Error, conn_error
|
50
|
+
else
|
51
|
+
raise Error, "Unable to connect to dtk network, please check your credentials and try again!"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
response = rest_method_func.call
|
56
|
+
|
57
|
+
# response
|
58
|
+
|
59
|
+
# if Response::ErrorHandler.check_for_session_expiried(response)
|
60
|
+
# # re-logging user and repeating request
|
61
|
+
# OsUtil.print_warning("Session expired: re-establishing session & re-trying request ...")
|
62
|
+
# @cookies = Session.re_initialize
|
63
|
+
# response = rest_method_func.call
|
64
|
+
# end
|
65
|
+
|
66
|
+
|
67
|
+
# response_obj = Response.new(response)
|
68
|
+
|
69
|
+
# queue messages from server to be displayed later
|
70
|
+
#TODO: DTK-2554: put in processing of messages Shell::MessageQueue.process_response(response_obj)
|
71
|
+
# response_obj
|
72
|
+
end
|
73
|
+
|
74
|
+
def login
|
75
|
+
response = post_raw rest_url('auth/sign_in'), get_credentials
|
76
|
+
if response.kind_of?(::DTK::Common::Response) and !response.ok?
|
77
|
+
@connection_error = response
|
78
|
+
else
|
79
|
+
@cookies = response.cookies
|
80
|
+
set_codecommit_info(response)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def logout
|
85
|
+
response = get_raw rest_url('auth/sign_out')
|
86
|
+
# TODO: see if response can be nil
|
87
|
+
raise Error, "Failed to logout, and terminate session!" unless response
|
88
|
+
@cookies = nil
|
89
|
+
end
|
90
|
+
|
91
|
+
def get_credentials
|
92
|
+
@parsed_credentials ||= Config.get_credentials
|
93
|
+
end
|
94
|
+
|
95
|
+
def default_rest_opts
|
96
|
+
@default_rest_opts ||= get_default_rest_opts
|
97
|
+
end
|
98
|
+
|
99
|
+
def get_default_rest_opts
|
100
|
+
{
|
101
|
+
:timeout => 200,
|
102
|
+
:open_timeout => 10,
|
103
|
+
:verify_ssl => OpenSSL::SSL::VERIFY_PEER
|
104
|
+
}
|
105
|
+
end
|
106
|
+
|
107
|
+
def get_raw(url, query_string_hash = {})
|
108
|
+
Response::RestClientWrapper.get_raw(url, query_string_hash, default_rest_opts.merge(:cookies => @cookies))
|
109
|
+
end
|
110
|
+
|
111
|
+
def post_raw(url, post_body, params = {})
|
112
|
+
Response::RestClientWrapper.post_raw(url, post_body, default_rest_opts.merge(:cookies => @cookies).merge(params))
|
113
|
+
end
|
114
|
+
|
115
|
+
def delete_raw(url, delete_body, params = {})
|
116
|
+
Response::RestClientWrapper.delete_raw(url, delete_body, default_rest_opts.merge(:cookies => @cookies).merge(params))
|
117
|
+
end
|
118
|
+
|
119
|
+
def json_parse_if_needed(item)
|
120
|
+
Response::RestClientWrapper.json_parse_if_needed(item)
|
121
|
+
end
|
122
|
+
|
123
|
+
def set_codecommit_info(response)
|
124
|
+
json_response = json_parse_if_needed(response)
|
125
|
+
# if codecommit_data = json_response.dig('data', 'meta', 'aws', 'codecommit')
|
126
|
+
if codecommit_data = json_response['data']['meta']['aws']['codecommit']
|
127
|
+
@codecommit = codecommit_data
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module DTK::Network
|
2
|
+
module Client
|
3
|
+
class DependencyTree
|
4
|
+
class Activated < Hash
|
5
|
+
def module_activated?(dependency)
|
6
|
+
if existing_dep = self["#{dependency.full_name}"]
|
7
|
+
if required_version = dependency.version
|
8
|
+
required_version.satisfied_by?(existing_dep[:version] || existing_dep['version'])
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def add!(dependency_mod)
|
14
|
+
self.merge!("#{dependency_mod.full_name}" => generate_content(dependency_mod))
|
15
|
+
end
|
16
|
+
|
17
|
+
def existing_name?(name)
|
18
|
+
self[name]
|
19
|
+
end
|
20
|
+
|
21
|
+
def delete!(dependency_mod)
|
22
|
+
self.delete(dependency_mod.full_name)
|
23
|
+
end
|
24
|
+
|
25
|
+
def generate_content(dependency_mod)
|
26
|
+
if dependency_mod.respond_to?(:source)
|
27
|
+
{ 'version' => dependency_mod.version.str_version, 'source' => dependency_mod.source }
|
28
|
+
else
|
29
|
+
{ 'version' => dependency_mod.version.str_version }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module DTK::Network::Client
|
2
|
+
class DependencyTree
|
3
|
+
class Cache < ::Hash
|
4
|
+
def initialize
|
5
|
+
super()
|
6
|
+
end
|
7
|
+
|
8
|
+
def add!(module_ref, dependencies)
|
9
|
+
self[index(module_ref)] ||= {:module_ref => module_ref, :dependencies => dependencies }
|
10
|
+
end
|
11
|
+
|
12
|
+
def lookup_dependencies?(module_ref)
|
13
|
+
(self[index(module_ref)] || {})[:dependencies]
|
14
|
+
end
|
15
|
+
|
16
|
+
def all_modules_refs
|
17
|
+
values.map { |hash| hash[:module_ref] }
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def index(module_ref)
|
23
|
+
"#{module_ref.module_name}--#{module_ref.namespace}--#{module_ref.version.str_version}"
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module DTK::Network
|
2
|
+
module Client
|
3
|
+
class DependencyTree
|
4
|
+
class Candidates < Hash
|
5
|
+
def add!(dependency_mod, versions)
|
6
|
+
self.merge!(dependency_mod.full_name => { 'dependency_obj' => dependency_mod, 'versions' => versions })
|
7
|
+
end
|
8
|
+
|
9
|
+
# def existing_name?(name)
|
10
|
+
# self[name]
|
11
|
+
# end
|
12
|
+
|
13
|
+
# def delete!(dependency_mod)
|
14
|
+
# self.delete(dependency_mod.full_name)
|
15
|
+
# end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|