yadecli 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/.DS_Store +0 -0
  3. data/.gitignore +2 -3
  4. data/Gemfile +5 -0
  5. data/Gemfile.lock +44 -2
  6. data/lib/yadecli/cli/application.rb +19 -4
  7. data/lib/yadecli/cli/composer.rb +70 -14
  8. data/lib/yadecli/cli/host.rb +19 -5
  9. data/lib/yadecli/cli/module.rb +14 -3
  10. data/lib/yadecli/cli/project.rb +30 -8
  11. data/lib/yadecli/cli/response/project_start_response.rb +21 -0
  12. data/lib/yadecli/cli/task.rb +9 -5
  13. data/lib/yadecli/client/gitlab_client.rb +4 -6
  14. data/lib/yadecli/command/composer/composer_install_command.rb +166 -0
  15. data/lib/yadecli/command/composer/composer_list_command.rb +63 -0
  16. data/lib/yadecli/command/composer/composer_log_command.rb +53 -0
  17. data/lib/yadecli/command/composer/composer_setup_command.rb +28 -0
  18. data/lib/yadecli/command/composer/composer_start_command.rb +70 -0
  19. data/lib/yadecli/command/composer/composer_stop_command.rb +60 -0
  20. data/lib/yadecli/command/composer/composer_switch_command.rb +51 -0
  21. data/lib/yadecli/command/composer/composer_uninstall_command.rb +44 -0
  22. data/lib/yadecli/command/connect_command.rb +29 -0
  23. data/lib/yadecli/command/host/host_bootstrap_command.rb +132 -0
  24. data/lib/yadecli/command/host/host_list_command.rb +36 -0
  25. data/lib/yadecli/command/host/host_provision_command.rb +59 -0
  26. data/lib/yadecli/command/login_command.rb +26 -0
  27. data/lib/yadecli/command/module/module_install_command.rb +79 -0
  28. data/lib/yadecli/command/module/module_list_command.rb +47 -0
  29. data/lib/yadecli/command/project/project_install_command.rb +58 -0
  30. data/lib/yadecli/command/project/project_list_command.rb +50 -0
  31. data/lib/yadecli/command/project/project_setup_command.rb +66 -0
  32. data/lib/yadecli/command/project/project_start_command.rb +110 -0
  33. data/lib/yadecli/command/project/project_uninstall_command.rb +44 -0
  34. data/lib/yadecli/command/task/task_list_command.rb +56 -0
  35. data/lib/yadecli/io/user_input.rb +1 -1
  36. data/lib/yadecli/util/cli_util.rb +11 -1
  37. data/lib/yadecli/util/maven_util.rb +35 -0
  38. data/lib/yadecli/version.rb +1 -1
  39. data/lib/yadecli.rb +38 -41
  40. data/scripts/setup-terminal.sh +1 -1
  41. data/yadecli.gemspec +6 -2
  42. metadata +81 -46
  43. data/lib/.DS_Store +0 -0
  44. data/lib/yadecli/.DS_Store +0 -0
  45. data/lib/yadecli/client/authentication_client.rb +0 -24
  46. data/lib/yadecli/client/base_client.rb +0 -78
  47. data/lib/yadecli/client/composer_container_client.rb +0 -27
  48. data/lib/yadecli/client/composer_project_client.rb +0 -27
  49. data/lib/yadecli/client/composer_service_client.rb +0 -27
  50. data/lib/yadecli/client/domain_client.rb +0 -23
  51. data/lib/yadecli/client/host_client.rb +0 -45
  52. data/lib/yadecli/client/maven_build_step_client.rb +0 -23
  53. data/lib/yadecli/client/maven_build_task_client.rb +0 -23
  54. data/lib/yadecli/client/nvm_runtime_client.rb +0 -23
  55. data/lib/yadecli/client/project_client.rb +0 -28
  56. data/lib/yadecli/client/project_module_client.rb +0 -35
  57. data/lib/yadecli/client/pyenv_runtime_client.rb +0 -23
  58. data/lib/yadecli/client/role_client.rb +0 -23
  59. data/lib/yadecli/client/rvm_runtime_client.rb +0 -23
  60. data/lib/yadecli/client/sdk_package_client.rb +0 -28
  61. data/lib/yadecli/client/vcs_client.rb +0 -23
  62. data/lib/yadecli/config/app_config.rb +0 -70
  63. data/lib/yadecli/model/composer_container.rb +0 -19
  64. data/lib/yadecli/model/composer_project.rb +0 -37
  65. data/lib/yadecli/model/composer_service.rb +0 -19
  66. data/lib/yadecli/model/domain.rb +0 -24
  67. data/lib/yadecli/model/host.rb +0 -24
  68. data/lib/yadecli/model/ide_type.rb +0 -7
  69. data/lib/yadecli/model/maven_build_step.rb +0 -19
  70. data/lib/yadecli/model/maven_build_task.rb +0 -19
  71. data/lib/yadecli/model/nvm_runtime.rb +0 -18
  72. data/lib/yadecli/model/project.rb +0 -26
  73. data/lib/yadecli/model/project_module.rb +0 -29
  74. data/lib/yadecli/model/pyenv_runtime.rb +0 -18
  75. data/lib/yadecli/model/role.rb +0 -24
  76. data/lib/yadecli/model/rvm_runtime.rb +0 -18
  77. data/lib/yadecli/model/sdk_package.rb +0 -18
  78. data/lib/yadecli/model/vcs.rb +0 -19
  79. data/lib/yadecli/service/authentication_service.rb +0 -31
  80. data/lib/yadecli/service/build_step_service.rb +0 -24
  81. data/lib/yadecli/service/build_task_service.rb +0 -70
  82. data/lib/yadecli/service/composer_service.rb +0 -416
  83. data/lib/yadecli/service/connect_service.rb +0 -19
  84. data/lib/yadecli/service/host_service.rb +0 -191
  85. data/lib/yadecli/service/module_service.rb +0 -78
  86. data/lib/yadecli/service/project_service.rb +0 -205
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'mutations'
4
+ require 'tty-table'
5
+
6
+ module Yadecli
7
+ module Command
8
+ module Composer
9
+ class ComposerListCommand < Mutations::Command
10
+
11
+ #
12
+ def execute
13
+ composer_project_client = Yade::Composer::Rest::Client::ComposerProjectClient.new
14
+ composer_service_client = Yade::Composer::Rest::Client::ComposerServiceClient.new
15
+
16
+ composer_projects = composer_project_client.list
17
+
18
+ # print table
19
+ table = TTY::Table.new header: ['Id', 'Name', 'Services', 'Installed', 'Branches', 'Git Url']
20
+
21
+ # add as rows to table
22
+ composer_projects.each do |p|
23
+ project_id = p.id
24
+ project_name = p.name
25
+ project_installed = p.installed?
26
+
27
+ composer_services = composer_service_client.get_by_composer_project_id(project_id)
28
+ service_names = composer_services.collect(&:name).join(', ')
29
+
30
+ gitlab_client = Yadecli::Client::GitlabClient.new
31
+
32
+ branches = gitlab_client.get_branch_names(p.git_repo_name)
33
+ default_branch = gitlab_client.get_default_branch(p.git_repo_name)
34
+
35
+ if project_installed
36
+ current_branch = FileUtil.git_current_branch(p.install_dir)
37
+ else
38
+ current_branch = nil
39
+ end
40
+
41
+ branches = branches.map do |b|
42
+ if b == default_branch && b == current_branch
43
+ "#{b} (Default, Current)"
44
+ elsif b == default_branch && b != current_branch
45
+ "#{b} (Default)"
46
+ elsif b == current_branch && b != default_branch
47
+ "#{b} (Current)"
48
+ else
49
+ b
50
+ end
51
+ end
52
+
53
+ table << [project_id, project_name, service_names , project_installed, branches.join(', '), p.gitUrl]
54
+ end
55
+
56
+ renderer = TTY::Table::Renderer::ASCII.new(table, padding: [0, 1])
57
+
58
+ renderer.render
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'mutations'
4
+
5
+ module Yadecli
6
+ module Command
7
+ module Composer
8
+ class ComposerLogCommand < Mutations::Command
9
+
10
+ required do
11
+ string :project_name, empty: false
12
+ string :service_name, empty: false
13
+ end
14
+
15
+ optional do
16
+ hash :options do
17
+ string :* # Allows any key to pass through. Useful for dynamic key / value objects
18
+ end
19
+ end
20
+
21
+ #
22
+ def execute
23
+ composer_project_client = Yade::Composer::Rest::Client::ComposerProjectClient.new
24
+ composer_service_client = Yade::Composer::Rest::Client::ComposerServiceClient.new
25
+ composer_container_client = Yade::Composer::Rest::Client::ComposerContainerClient.new
26
+
27
+ composer_project = composer_project_client.get_by_name(project_name)
28
+ composer_services = composer_service_client.get_by_composer_project_id(composer_project.id)
29
+
30
+ composer_service = composer_services.select { |s| s.name == service_name }.first
31
+
32
+ composer_containers = composer_container_client.get_by_composer_service_id(composer_service.id)
33
+
34
+ container_names = composer_containers.map(&:name).join(' ')
35
+
36
+ begin
37
+ cmdline = 'docker-compose logs'
38
+ cmdline += ' -f' if options[:follow]
39
+ cmdline += " #{container_names}"
40
+
41
+ cmd = TTY::Command.new(uuid: false)
42
+
43
+ cmd.run(cmdline, chdir: composer_project.install_dir)
44
+ rescue TTY::Command::ExitError => e
45
+ puts e
46
+ end
47
+
48
+ 'Yade composer service successfully logged'
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'mutations'
4
+ require 'uri'
5
+
6
+ module Yadecli
7
+ module Command
8
+ module Composer
9
+ class ComposerSetupCommand < Mutations::Command
10
+
11
+ #
12
+ def execute
13
+ Yade::Common::Config::ComposerConfig[:git_api_url] = UserInput.ask(' * Gitlab API Url?', :git_api_url)
14
+ Yade::Common::Config::ComposerConfig[:git_username] = UserInput.ask(' * Gitlab Username?', :git_username)
15
+ Yade::Common::Config::ComposerConfig[:git_password] = UserInput.ask(' * Gitlab Password?', :git_password)
16
+ Yade::Common::Config::ComposerConfig[:git_token] = UserInput.ask(' * Gitlab Api Token?', :git_token)
17
+ Yade::Common::Config::ComposerConfig[:docker_registry_url] = UserInput.ask(' * Docker Registry Url?', :docker_registry_url)
18
+ Yade::Common::Config::ComposerConfig[:docker_registry_username] = UserInput.ask(' * Docker Registry Username?', :docker_registry_username)
19
+ Yade::Common::Config::ComposerConfig[:docker_registry_password] = UserInput.ask(' * Docker Registry Password?', :docker_registry_password)
20
+
21
+ Yade::Common::Config::ComposerConfig.write!
22
+
23
+ 'Yade compose successfully setup'
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'mutations'
4
+
5
+ module Yadecli
6
+ module Command
7
+ module Composer
8
+ class ComposerStartCommand < Mutations::Command
9
+
10
+ required do
11
+ string :project_name, empty: false
12
+ string :service_name, empty: false
13
+ end
14
+
15
+ optional do
16
+ hash :options do
17
+ string :* # Allows any key to pass through. Useful for dynamic key / value objects
18
+ end
19
+ end
20
+
21
+ #
22
+ def execute
23
+ composer_project_client = Yade::Composer::Rest::Client::ComposerProjectClient.new
24
+ composer_service_client = Yade::Composer::Rest::Client::ComposerServiceClient.new
25
+ composer_container_client = Yade::Composer::Rest::Client::ComposerContainerClient.new
26
+
27
+ begin
28
+ composer_project = composer_project_client.get_by_name(project_name)
29
+ composer_services = composer_service_client.get_by_composer_project_id(composer_project.id)
30
+
31
+ # load project dotenv
32
+ dotenv_file = "#{composer_project.install_dir}/.env"
33
+ Dotenv.load(dotenv_file)
34
+
35
+ # check required envs are set fom .env file or system environment variables
36
+ composer_service = composer_services.select { |s| s.name == service_name }.first
37
+
38
+ composer_service.requiredEnvs&.split(',').each do |re|
39
+ if ENV[re] == nil
40
+ puts ''
41
+ puts "Unable to start service. Required environment variable #{re} is not set.".colorize(:red)
42
+ puts "Either specify the variable and a value in #{dotenv_file} or as a system environment variable an try to run again.".colorize(:red)
43
+
44
+ exit 1
45
+ end
46
+ end
47
+
48
+ composer_containers = composer_container_client.get_by_composer_service_id(composer_service.id)
49
+
50
+ cmdline = "docker-compose up -d #{composer_containers.map(&:name).join(' ')}"
51
+
52
+ cmd = TTY::Command.new(output: Yadecli.LOGGER)
53
+
54
+ puts ''
55
+ print "Executing command '#{cmdline}'... "
56
+
57
+ cmd.run(cmdline, chdir: composer_project.install_dir)
58
+
59
+ puts 'done'.colorize(:green)
60
+ rescue TTY::Command::ExitError => e
61
+ puts 'failed'.colorize(:red)
62
+ puts e
63
+ end
64
+
65
+ 'Yade composer service successfully started'
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'mutations'
4
+
5
+ module Yadecli
6
+ module Command
7
+ module Composer
8
+ class ComposerStopCommand < Mutations::Command
9
+
10
+ required do
11
+ string :project_name, empty: false
12
+ string :service_name, empty: false
13
+ end
14
+
15
+ optional do
16
+ hash :options do
17
+ string :* # Allows any key to pass through. Useful for dynamic key / value objects
18
+ end
19
+ end
20
+
21
+ #
22
+ def execute
23
+ composer_project_client = Yade::Composer::Rest::Client::ComposerProjectClient.new
24
+ composer_service_client = Yade::Composer::Rest::Client::ComposerServiceClient.new
25
+ composer_container_client = Yade::Composer::Rest::Client::ComposerContainerClient.new
26
+
27
+ begin
28
+ composer_project = composer_project_client.get_by_name(project_name)
29
+ composer_services = composer_service_client.get_by_composer_project_id(composer_project.id)
30
+
31
+ composer_service = composer_services.select { |s| s.name == service_name }.first
32
+
33
+ composer_containers = composer_container_client.get_by_composer_service_id(composer_service.id)
34
+
35
+ container_names = composer_containers.map(&:name).join(' ')
36
+
37
+ cmdline = "docker-compose stop #{container_names}"
38
+ cmdline += " && docker-compose rm -f #{container_names}" if options[:rm]
39
+ cmdline += ' && docker-compose down -v' if options[:down]
40
+
41
+ cmd = TTY::Command.new(output: Yadecli.LOGGER)
42
+
43
+ puts ''
44
+ print "Executing command '#{cmdline}'... "
45
+
46
+ cmd.run(cmdline, chdir: composer_project.install_dir)
47
+
48
+ puts 'done'.colorize(:green)
49
+ rescue TTY::Command::ExitError => e
50
+ puts 'failed'.colorize(:red)
51
+ puts ''
52
+ 'Stopping Yade composer service failed'
53
+ end
54
+ puts ''
55
+ 'Yade composer service successfully stopped'
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'mutations'
4
+
5
+ module Yadecli
6
+ module Command
7
+ module Composer
8
+ class ComposerSwitchCommand < Mutations::Command
9
+
10
+ required do
11
+ string :project_name, empty: false
12
+ string :target_branch, empty: false
13
+ end
14
+
15
+ optional do
16
+ hash :options do
17
+ string :* # Allows any key to pass through. Useful for dynamic key / value objects
18
+ end
19
+ end
20
+
21
+ #
22
+ def execute
23
+ composer_project_client = Yade::Composer::Rest::Client::ComposerProjectClient.new
24
+
25
+ composer_project = composer_project_client.get_by_name(project_name)
26
+
27
+ message = "Switching to branch #{target_branch}"
28
+ message += ' and pull changes' if options[:pull]
29
+
30
+ print message
31
+
32
+ cmdline = "git fetch && git checkout -B #{target_branch}"
33
+ cmdline += " && git pull origin #{target_branch}" if options[:pull]
34
+
35
+ begin
36
+ cmd = TTY::Command.new(output: Yadecli.LOGGER)
37
+
38
+ cmd.run(cmdline, chdir: composer_project.install_dir)
39
+
40
+ puts ' done'.colorize(:green)
41
+ rescue TTY::Command::ExitError => e
42
+ puts ' failed'.colorize(:red)
43
+ puts e
44
+ end
45
+
46
+ 'Yade composer project successfully switched'
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'mutations'
4
+
5
+ module Yadecli
6
+ module Command
7
+ module Composer
8
+ class ComposerUninstallCommand < Mutations::Command
9
+
10
+ required do
11
+ string :project_name, empty: false
12
+ end
13
+
14
+ optional do
15
+ hash :options do
16
+ string :* # Allows any key to pass through. Useful for dynamic key / value objects
17
+ end
18
+ end
19
+
20
+ #
21
+ def execute
22
+ composer_project_client = Yade::Composer::Rest::Client::ComposerProjectClient.new
23
+
24
+ composer_project = composer_project_client.get_by_name(project_name)
25
+
26
+ answer = false
27
+ unless options[:yes]
28
+ prompt = TTY::Prompt.new
29
+ answer = prompt.yes?("Do you really want to uninstall the #{composer_project.project_name} composer project?".colorize(:mode => :bold))
30
+ end
31
+
32
+ if options[:yes] || answer
33
+ FileUtils.rm_rf(composer_project.install_dir)
34
+ else
35
+ puts 'There is nothing more I can do for you. Bye.'
36
+ exit(1)
37
+ end
38
+
39
+ 'Composer project successfully uninstalled'
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'mutations'
4
+ require 'uri'
5
+
6
+ module Yadecli
7
+ module Command
8
+ class ConnectCommand < Mutations::Command
9
+
10
+ required do
11
+ string :yade_url, matches: URI.regexp
12
+ end
13
+
14
+ # These inputs are optional
15
+ #optional do
16
+ # boolean :newsletter_subscribe
17
+ #end
18
+
19
+ # The execute method is called only if the inputs validate. It does your business action.
20
+ def execute
21
+ Yade::Common::Config::AppConfig[:yade_url] = self.yade_url
22
+
23
+ Yade::Common::Config::AppConfig.write!
24
+
25
+ "Successfully connected to Yade at url #{self.yade_url}"
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,132 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'mutations'
4
+ require 'net/ssh'
5
+
6
+ module Yadecli
7
+ module Command
8
+ module Host
9
+ class HostBootstrapCommand < Mutations::Command
10
+
11
+ required do
12
+ string :host_fqdn, matches: /^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/
13
+ end
14
+
15
+ optional do
16
+ hash :options do
17
+ string :* # Allows any key to pass through. Useful for dynamic key / value objects
18
+ end
19
+ end
20
+
21
+ # The execute method is called only if the inputs validate. It does your business action.
22
+ def execute
23
+ host_client = Yade::Domain::Rest::Client::HostClient.new
24
+ domain_client = Yade::Domain::Rest::Client::DomainClient.new
25
+ role_client = Yade::Domain::Rest::Client::RoleClient.new
26
+
27
+ master_host = host_client.master
28
+ host = host_client.host_by_fqdn(self.host_fqdn)
29
+
30
+ domain_id = host.domainId
31
+ domain = domain_client.get(domain_id)
32
+
33
+ role_id = host.roleId
34
+ role = role_client.get(role_id)
35
+
36
+ username = host.username
37
+ port = host.sshPort || 22
38
+
39
+ Net::SSH.start(host.hostName, username, port: port) do |ssh|
40
+ # checkout_dir = Yade::Common::Config::AppConfig[:yade_home]
41
+ checkout_dir = "/home/#{username}/.yade"
42
+ local_repo = "#{checkout_dir}/puppet-bootstrap"
43
+
44
+ # clone or update
45
+ output = ssh.exec!("mkdir -p #{checkout_dir}")
46
+ puts output if options[:verbose]
47
+
48
+ clone_cmd = "git clone -b #{Yade::Common::Config::DomainConfig[:yade_bootstrap_repo_branch]} --depth 1 #{Yade::Common::Config::DomainConfig[:yade_bootstrap_repo_url]} #{local_repo} || (cd #{local_repo} ; git pull)"
49
+ puts clone_cmd
50
+ output = ssh.exec!(clone_cmd)
51
+ puts output if options[:verbose]
52
+
53
+ # setup
54
+ if options[:setup]
55
+ # output = ssh.exec!("mkdir -p #{local_repo}")
56
+ # puts output if options[:verbose]
57
+
58
+ output = ssh.exec!("sudo #{local_repo}/scripts/ubuntu/setup-managed-host.sh #{host.hostName} #{domain.name} #{host.ip}")
59
+ puts output if options[:verbose]
60
+
61
+ output = ssh.exec!("sudo #{local_repo}/scripts/ubuntu/local-bootstrap.sh \"mc nano\"")
62
+ puts output if options[:verbose]
63
+
64
+ output = ssh.exec!("sudo #{local_repo}/scripts/ubuntu/puppet-install.sh")
65
+ puts output if options[:verbose]
66
+
67
+ # noinspection RubyLiteralArrayInspection
68
+ modules = Yade::Common::Config::DomainConfig[:yade_bootstrap_puppet_modules]
69
+
70
+ FileUtils.rm_rf 'modules'
71
+ FileUtils.mkdir_p 'modules'
72
+
73
+ output = ssh.exec!("echo $HTTP_PROXY")
74
+ puts output if options[:verbose]
75
+
76
+ modules.each do |mod, version|
77
+ cmd = "puppet module install --modulepath #{local_repo}/modules --version #{version} #{mod}"
78
+
79
+ output = ssh.exec!(cmd)
80
+ puts output if options[:verbose]
81
+ end
82
+ end
83
+
84
+ # provision
85
+ cmd_a = [
86
+ 'FACTER_vagrant=1',
87
+ "FACTER_host_ip=#{host.ip}",
88
+ "FACTER_host_name=#{host.hostName}",
89
+ "FACTER_host_domain=#{domain.name}",
90
+ "FACTER_master_ip=#{master_host.ip}",
91
+ "FACTER_master_host_name=#{master_host.hostName}",
92
+ "FACTER_role=#{role.name}",
93
+ "FACTER_datacenter=#{host.datacenter}",
94
+ "FACTER_zone=#{host.zone}",
95
+ "FACTER_is_master=#{host.isMaster}",
96
+ "FACTER_username=#{username}",
97
+ 'sudo --preserve-env puppet apply',
98
+ "--hiera_config=#{local_repo}/config/hiera.yml",
99
+ "--modulepath=#{local_repo}/modules:#{local_repo}/dist",
100
+ "#{local_repo}/environments/production/manifests/default.pp"
101
+ ]
102
+
103
+ cmd_line = cmd_a.join(' ')
104
+
105
+ puts cmd_line if options[:verbose]
106
+
107
+ channel = ssh.open_channel do |ch|
108
+ ch.exec cmd_line do |ch, success|
109
+ raise "could not execute command" unless success
110
+
111
+ # "on_data" is called when the process writes something to stdout
112
+ ch.on_data do |c, data|
113
+ $stdout.print data if options[:verbose]
114
+ end
115
+
116
+ # "on_extended_data" is called when the process writes something to stderr
117
+ ch.on_extended_data do |c, type, data|
118
+ $stderr.print data if options[:verbose]
119
+ end
120
+
121
+ ch.on_close { puts "done!" }
122
+ end
123
+ end
124
+
125
+ channel.wait
126
+ end
127
+ "Successfully bootstrapped host #{self.host_fqdn}"
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'mutations'
4
+ require 'tty-table'
5
+
6
+ module Yadecli
7
+ module Command
8
+ module Host
9
+ class HostListCommand < Mutations::Command
10
+
11
+ #
12
+ def execute
13
+ host_client = Yade::Domain::Rest::Client::HostClient.new
14
+ domain_client = Yade::Domain::Rest::Client::DomainClient.new
15
+ role_client = Yade::Domain::Rest::Client::RoleClient.new
16
+
17
+ hosts = host_client.list
18
+
19
+ table = TTY::Table.new header: ['Name', 'Domain', 'Role', 'Ip', 'OsType', 'Environment']
20
+
21
+ hosts.each do |h|
22
+ domain_id = h.domainId
23
+ domain = domain_client.get(domain_id)
24
+
25
+ role_id = h.roleId
26
+ role = role_client.get(role_id)
27
+
28
+ table << [h.name, domain.name, role.name, h.ip, h.osType, h.environmentType]
29
+ end
30
+
31
+ table.render(:ascii, width: 100, resize: true, padding: [0, 1])
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'mutations'
4
+ require 'net/ssh'
5
+
6
+ module Yadecli
7
+ module Command
8
+ module Host
9
+ class HostProvisionCommand < Mutations::Command
10
+
11
+ required do
12
+ string :host_fqdn, matches: /^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/
13
+ end
14
+
15
+ optional do
16
+ hash :options do
17
+ string :* # Allows any key to pass through. Useful for dynamic key / value objects
18
+ end
19
+ end
20
+
21
+ #
22
+ def execute
23
+ host_client = Yade::Domain::Rest::Client::HostClient.new
24
+
25
+ host = host_client.host_by_fqdn(self.host_fqdn)
26
+
27
+ username = host.username
28
+ port = host.sshPort || 22
29
+
30
+ Net::SSH.start(host.hostName, username, port: port) do |ssh|
31
+ # clone or update
32
+ cmd_line = "sudo puppet agent -t --environment=#{host.environmentType.downcase}"
33
+
34
+ channel = ssh.open_channel do |ch|
35
+ ch.exec cmd_line do |ch, success|
36
+ raise "could not execute command" unless success
37
+
38
+ # "on_data" is called when the process writes something to stdout
39
+ ch.on_data do |c, data|
40
+ $stdout.print data if options[:verbose]
41
+ end
42
+
43
+ # "on_extended_data" is called when the process writes something to stderr
44
+ ch.on_extended_data do |c, type, data|
45
+ $stderr.print data if options[:verbose]
46
+ end
47
+
48
+ ch.on_close { puts "done!" }
49
+ end
50
+ end
51
+
52
+ channel.wait
53
+ end
54
+ "Successfully provisioned host #{self.host_fqdn}"
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'uri'
4
+
5
+ # yadecli cli
6
+ module Yadecli
7
+ module Command
8
+ # login
9
+ class LoginCommand < Mutations::Command
10
+
11
+ required do
12
+ string :auth_url, matches: URI.regexp
13
+ string :auth_username, empty: false
14
+ string :auth_password, empty: false
15
+ end
16
+
17
+ def execute
18
+ authentication_client = Yade::Common::Client::AuthenticationClient.new
19
+
20
+ authentication = authentication_client.login(auth_url, auth_username, auth_password)
21
+
22
+ "Successfully logged in user #{authentication.auth_username} with password *** at uaa #{authentication.auth_url}"
23
+ end
24
+ end
25
+ end
26
+ end