sct 1.1.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/henk/lib/henk.rb +5 -0
- data/henk/lib/henk/commands_generator.rb +136 -0
- data/henk/lib/henk/module.rb +7 -0
- data/henk/lib/henk/runner.rb +175 -0
- data/sct/lib/sct/tools.rb +2 -1
- data/sct/lib/sct/version.rb +1 -1
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a7b7da8359137491424793ea19a9ae9d845bb11cb84a8df92b2c0135fe335948
|
4
|
+
data.tar.gz: 6ebe428263d46c7fd9d36f43c7503c6b640ed6d2ce30f5ef32204e12d50a771e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fca4bbe727e063bd35b3676a7a98c1c2349b05d69517b9c2104871358b17a1571077c3735dc4967157580a1e6d5a83a3515b6fe833b1b5c13a82189e06af1af0
|
7
|
+
data.tar.gz: f03408e6083a32af44de9f65784dee6d3b74deb9f72915babc3f3c8a50713eaf312697da77e50826391ab58f3990c7c81cbcb49cc881d3e231fa213fe50da61f
|
data/henk/lib/henk.rb
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
require 'commander'
|
2
|
+
require_relative 'runner'
|
3
|
+
require 'pp'
|
4
|
+
|
5
|
+
module Henk
|
6
|
+
class CommandsGenerator
|
7
|
+
include Commander::Methods
|
8
|
+
|
9
|
+
def self.start
|
10
|
+
self.new.run
|
11
|
+
end
|
12
|
+
|
13
|
+
def run
|
14
|
+
add_commander_methods
|
15
|
+
|
16
|
+
Henk::Runner.new.verify_cluster_active
|
17
|
+
|
18
|
+
program :name, 'henk'
|
19
|
+
program :version, Sct::VERSION
|
20
|
+
program :description, 'CLI for \'henk\' - Interact with Henk 3.0 to be able to create/copy/delete customers'
|
21
|
+
|
22
|
+
$dev = false
|
23
|
+
$verbose = false
|
24
|
+
global_option('--dev') { $dev = true }
|
25
|
+
global_option('--verbose') { $verbose = true }
|
26
|
+
|
27
|
+
command :create do |c|
|
28
|
+
c.syntax = 'sct henk create'
|
29
|
+
c.description = 'Create a client in your local development.'
|
30
|
+
c.required_option '--domain DOMAIN', 'The domain name of the new customer.'
|
31
|
+
c.required_option '--organization-name ORGANIZATION_NAME', 'The name of the organization.'
|
32
|
+
c.required_option '--modules MODULES', 'Allowed modules. ex: 01, 02, 03, ...'
|
33
|
+
|
34
|
+
c.action do |args, options|
|
35
|
+
c.validate options
|
36
|
+
|
37
|
+
options.dev = $dev
|
38
|
+
options.verbose = $verbose
|
39
|
+
Henk::Runner.new.henk "create", options
|
40
|
+
Henk::Runner.new.encrypt_config_data options.domain
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
command :copy do |c|
|
45
|
+
c.syntax = 'sct henk copy'
|
46
|
+
c.description = 'Copy a client from another environment to your local environment'
|
47
|
+
c.required_option '--domain DOMAIN', 'The domain to copy.'
|
48
|
+
c.option '--source-environment SOURCE_ENVIRONMENT', 'The name of the source environment (currently only local allowed).'
|
49
|
+
c.option '--target-domain DOMAIN', 'The name of the domain on the local environment. When making a local copy it cannot be the same name'
|
50
|
+
c.option '--overwrite', 'Set this flag if you want to overwrite an existing target-domain.'
|
51
|
+
c.option '--copy-data', 'Set this flag if you want to copy the data of the source client'
|
52
|
+
|
53
|
+
# Specify command options here
|
54
|
+
c.action do |args, options|
|
55
|
+
c.validate options
|
56
|
+
|
57
|
+
unless options.source_environment
|
58
|
+
options.source_environment = "local"
|
59
|
+
end
|
60
|
+
|
61
|
+
# Temporary provision until we can copy environments from Accept
|
62
|
+
if options.source_environment != "local"
|
63
|
+
raise ArgumentError.new("It's currently not possible to copy an cloud environment.".yellow)
|
64
|
+
end
|
65
|
+
|
66
|
+
options.target_environment = "local"
|
67
|
+
|
68
|
+
unless options.target_domain
|
69
|
+
options.target_domain = options.domain
|
70
|
+
end
|
71
|
+
|
72
|
+
if options.source_environment == options.target_environment \
|
73
|
+
and options.domain == options.target_domain
|
74
|
+
raise ArgumentError.new("The source and target domains cannot be the same.")
|
75
|
+
end
|
76
|
+
|
77
|
+
options.dev = $dev
|
78
|
+
options.verbose = $verbose
|
79
|
+
Henk::Runner.new.henk "copy", options
|
80
|
+
Henk::Runner.new.encrypt_config_data options.target_domain
|
81
|
+
Henk::Runner.new.synchronize_employees options.target_domain
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
command :remove do |c|
|
86
|
+
c.syntax = 'sct henk remove'
|
87
|
+
c.description = 'Remove a client from your local environment.'
|
88
|
+
c.required_option '--domain DOMAIN', 'The domain to remove.'
|
89
|
+
c.option '--user-email EMAIL', 'The email address of the user removing the customer'
|
90
|
+
|
91
|
+
c.action do |args, options|
|
92
|
+
c.validate options
|
93
|
+
options.dev = $dev
|
94
|
+
options.verbose = $verbose
|
95
|
+
Henk::Runner.new.henk 'remove', options
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
command :"list-clients" do |c|
|
100
|
+
c.syntax = 'sct henk list-clients'
|
101
|
+
c.description = 'List all clients that are available on the dev environment'
|
102
|
+
|
103
|
+
c.action do |args, options|
|
104
|
+
Henk::Runner.new.list_clients
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
run!
|
109
|
+
end
|
110
|
+
|
111
|
+
# Ruben's suggestion but still need some workaround
|
112
|
+
def add_commander_methods
|
113
|
+
Commander::Command.class_eval {
|
114
|
+
attr_accessor :required
|
115
|
+
|
116
|
+
def required_option(*arg, &block)
|
117
|
+
unless self.required
|
118
|
+
@required = []
|
119
|
+
end
|
120
|
+
|
121
|
+
option = arg.select{|item| item.start_with?('--')}.map{|a| a.gsub(/\-\-([^\s]*)(.*)/, '\1')}.shift
|
122
|
+
self.required << option.to_s.tr('-', '_')
|
123
|
+
self.option(*arg)
|
124
|
+
end
|
125
|
+
|
126
|
+
def validate options
|
127
|
+
self.required.each do |option|
|
128
|
+
if options.__hash__[:"#{option}"].nil? || options.__hash__[:"#{option}"] == ''
|
129
|
+
raise ArgumentError.new("The --#{option} argument is a required argument")
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
}
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
@@ -0,0 +1,175 @@
|
|
1
|
+
require 'pp'
|
2
|
+
|
3
|
+
module Henk
|
4
|
+
class Runner
|
5
|
+
attr_accessor :options_mapping
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@options_mapping = {
|
9
|
+
"organization_name" => {
|
10
|
+
"name" => "organization-name"
|
11
|
+
},
|
12
|
+
"modules" => {
|
13
|
+
"name" => "modules",
|
14
|
+
"type" => "array"
|
15
|
+
},
|
16
|
+
"database_source" => {
|
17
|
+
"name" => "database-source"
|
18
|
+
},
|
19
|
+
"target_domain" => {
|
20
|
+
"name" => "target-domain"
|
21
|
+
},
|
22
|
+
"copy_data" => {
|
23
|
+
"name" => "copy-data"
|
24
|
+
},
|
25
|
+
"source_environment" => {
|
26
|
+
"name" => "source-environment"
|
27
|
+
},
|
28
|
+
"target_environment" => {
|
29
|
+
"name" => "target-environment"
|
30
|
+
},
|
31
|
+
"user_email" => {
|
32
|
+
"name" => "user-email"
|
33
|
+
}
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
def run command
|
38
|
+
if !system command
|
39
|
+
raise command.red
|
40
|
+
end
|
41
|
+
|
42
|
+
rescue Interrupt
|
43
|
+
end
|
44
|
+
|
45
|
+
def verify_cluster_active
|
46
|
+
required_containers = [
|
47
|
+
"proactive-config",
|
48
|
+
"proactive-frame",
|
49
|
+
"mysql-service"
|
50
|
+
]
|
51
|
+
|
52
|
+
if !system "docker network inspect spend-cloud > /dev/null"
|
53
|
+
puts "Error: ".red + "The local spend-cloud cluster doesn't seem to be running."
|
54
|
+
exit(1)
|
55
|
+
end
|
56
|
+
|
57
|
+
connected_to_network = `docker network inspect spend-cloud | jq '.[0] | .Containers | map(select((.Name | test("^#{required_containers.join('|^')}")))) | length'`
|
58
|
+
|
59
|
+
if connected_to_network.to_s.strip! != "3"
|
60
|
+
puts "Error: ".red + "Not all required services are running or connected to the cluster (#{connected_to_network}/3)"
|
61
|
+
exit(1)
|
62
|
+
end
|
63
|
+
|
64
|
+
return true
|
65
|
+
end
|
66
|
+
|
67
|
+
def henk command, options = {}
|
68
|
+
begin
|
69
|
+
volumes = get_volumes_string(options.dev)
|
70
|
+
image = get_latest_image
|
71
|
+
verbose = options.verbose
|
72
|
+
|
73
|
+
options = options_to_string options
|
74
|
+
to_run = "docker run -it --rm --network spend-cloud #{volumes} #{image} #{command} #{options}"
|
75
|
+
|
76
|
+
if verbose
|
77
|
+
puts "Running: #{to_run.green}"
|
78
|
+
end
|
79
|
+
|
80
|
+
self.run to_run
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def list_clients
|
85
|
+
self.run "docker exec -it mysql-service mysql -u root -sN -e 'SELECT `043` FROM `spend-cloud-config`.`00_settings` ORDER BY `043` ASC'"
|
86
|
+
end
|
87
|
+
|
88
|
+
def encrypt_config_data domain
|
89
|
+
puts "Manually encrypting config data for #{domain}".green
|
90
|
+
php_command = "php /var/www/scripts/encryptConfigData.php -c='#{domain}' --execute"
|
91
|
+
command = 'docker exec -it proactive-config bash -c "#{php_command}"'
|
92
|
+
self.run command
|
93
|
+
end
|
94
|
+
|
95
|
+
def synchronize_employees domain
|
96
|
+
puts "Manually synchronizing employees with shared storage for #{domain}".green
|
97
|
+
php_command = "php /var/www/scripts/syncEmployees.php --client='#{domain}'"
|
98
|
+
command = 'docker exec -it proactive-frame bash -c "#{php_command}"'
|
99
|
+
self.run command
|
100
|
+
end
|
101
|
+
|
102
|
+
def get_latest_image
|
103
|
+
latest_version = `gcloud container images list-tags eu.gcr.io/dev-pasc-vcdm/henk-app --limit 1 --format=\"json\" | jq -r '[.[0].tags | sort_by(length)[] | select(match(\"^[0-9]+$\"))] | first'`
|
104
|
+
return "eu.gcr.io/dev-pasc-vcdm/henk-app:#{latest_version.strip}"
|
105
|
+
end
|
106
|
+
|
107
|
+
def get_volumes_string dev = false
|
108
|
+
volumes = {
|
109
|
+
"spend-cloud_shared-storage" => "/data"
|
110
|
+
}
|
111
|
+
|
112
|
+
if dev
|
113
|
+
repoPath = Sct::Helper.homePath + "/development/henk"
|
114
|
+
|
115
|
+
if not Dir.exists?(repoPath)
|
116
|
+
puts "Warning: ".yellow + "To run in development mode you need a checkout for the Henk repository. Continuing in normal mode."
|
117
|
+
else
|
118
|
+
dev_volumes = {
|
119
|
+
repoPath + "/modules" => "/var/scripts/modules",
|
120
|
+
repoPath + "/client.py" => "/var/scripts/client.py",
|
121
|
+
repoPath + "/environment_mapping.json" => "/var/scripts/environment_mapping.json",
|
122
|
+
repoPath + "/logging-config.json" => "/var/scripts/logging-config.json",
|
123
|
+
repoPath + "/schemas" => "/var/scripts/schemas",
|
124
|
+
repoPath + "/resources" => "/var/local"
|
125
|
+
}
|
126
|
+
|
127
|
+
volumes = volumes.merge(dev_volumes)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
return volumes.map{|k,v| "-v #{k}:#{v}"}.join(' ')
|
132
|
+
end
|
133
|
+
|
134
|
+
def options_to_string options = {}
|
135
|
+
options_str = ''
|
136
|
+
|
137
|
+
if options.verbose
|
138
|
+
options_str += '--verbose '
|
139
|
+
end
|
140
|
+
|
141
|
+
if options.overwrite
|
142
|
+
options_str += '--overwrite '
|
143
|
+
end
|
144
|
+
|
145
|
+
if options.copy_data
|
146
|
+
options_str += '--copy-data '
|
147
|
+
end
|
148
|
+
|
149
|
+
options = options.__hash__
|
150
|
+
|
151
|
+
options.delete(:dev)
|
152
|
+
options.delete(:verbose)
|
153
|
+
options.delete(:overwrite)
|
154
|
+
options.delete(:copy_data)
|
155
|
+
|
156
|
+
parsed_options = []
|
157
|
+
|
158
|
+
options.each do |k,v|
|
159
|
+
if self.options_mapping["#{k}"]
|
160
|
+
mapping = self.options_mapping["#{k}"]
|
161
|
+
k = mapping['name']
|
162
|
+
|
163
|
+
if mapping['type'] == "array"
|
164
|
+
v = v.split(',').join(' ')
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
parsed_options << "--#{k} #{v}"
|
169
|
+
end
|
170
|
+
|
171
|
+
options_str += parsed_options.join(' ')
|
172
|
+
return options_str
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
data/sct/lib/sct/tools.rb
CHANGED
data/sct/lib/sct/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sct
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Reshad Farid
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-07-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colored
|
@@ -215,6 +215,10 @@ files:
|
|
215
215
|
- cluster/lib/cluster/commands_generator.rb
|
216
216
|
- cluster/lib/cluster/module.rb
|
217
217
|
- cluster/lib/cluster/runner.rb
|
218
|
+
- henk/lib/henk.rb
|
219
|
+
- henk/lib/henk/commands_generator.rb
|
220
|
+
- henk/lib/henk/module.rb
|
221
|
+
- henk/lib/henk/runner.rb
|
218
222
|
- sct/lib/.DS_Store
|
219
223
|
- sct/lib/sct.rb
|
220
224
|
- sct/lib/sct/.DS_Store
|
@@ -250,6 +254,7 @@ post_install_message:
|
|
250
254
|
rdoc_options: []
|
251
255
|
require_paths:
|
252
256
|
- cluster/lib
|
257
|
+
- henk/lib
|
253
258
|
- sct/lib
|
254
259
|
- sct_core/lib
|
255
260
|
required_ruby_version: !ruby/object:Gem::Requirement
|