picsolve_docker_builder 0.5.1 → 0.5.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ff6dc295b2b3965dc57e04b6939e98c6e39028f6
4
- data.tar.gz: fa1feef27218916f7c8ea253b43495645089c0fc
3
+ metadata.gz: b5054af6f95aeaf16fa2778e2cce3ab643278fd6
4
+ data.tar.gz: f7a182c402001931a9d1c7782461c47d45937b4a
5
5
  SHA512:
6
- metadata.gz: 610fb9fd6451749f7c11aaf818ca6a39d578617a45a65e915e25d69266d3c40f2114d76df9e76387283478d5650c63c086c6e1b8488c8fa8439108b9c028e265
7
- data.tar.gz: 731f2eeafe0e07ca9bc4cae992eda2022a3c9a9add0b499321f1f874c25e14fd6f796e5a269bc040d44799e86450f99742a831293a153db3de84049016b4395e
6
+ metadata.gz: d79c083d740bd2edfe11ddbf7ad49e7321e474beb0c168f72f5311fdc9cb9d3bdd792ddb392e7c736d06f449df7892b62f267596ed28ee85627dfb7d2f15e6e4
7
+ data.tar.gz: b392c2ceee3297c4a2f5f9770b6a5ad2ae0310993280e0ab65206be1578a1bb833e063829e38f3d5f36c6d2acd2a7b7ee6e262a3eca45c0966b49bfe629bc8ee
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Change Log
2
2
 
3
+ ## [0.5.2] - 2016-03-08
4
+ ### Added
5
+ - Support for cleaning up ci/test stage databases and replication controllers
6
+
3
7
  ## [0.5.1] - 2016-03-07
4
8
  ### Added
5
9
  - Support for storing/updateing tag information within config file
@@ -55,6 +55,15 @@ module PicsolveDockerBuilder
55
55
  end
56
56
  end
57
57
 
58
+ def cleanup
59
+ kubernetes_clusters.each do |cluster|
60
+ begin
61
+ log.info "Cleanup kubernetes cluster #{cluster.host}"
62
+ cluster.cleanup
63
+ end
64
+ end
65
+ end
66
+
58
67
  def deploy
59
68
  errors = 0
60
69
  kubernetes_clusters.each do |cluster|
@@ -37,6 +37,10 @@ module PicsolveDockerBuilder
37
37
  SecureRandom.urlsafe_base64(length)
38
38
  end
39
39
 
40
+ def delete_secret(name)
41
+ kubernetes.client.delete_secret name, namespace
42
+ end
43
+
40
44
  def create_secret(name, obj)
41
45
  secret = Kubeclient::Secret.new
42
46
  secret.metadata = {
@@ -28,20 +28,27 @@ module PicsolveDockerBuilder
28
28
  create_postgres_secret
29
29
  end
30
30
 
31
+ # ssh port forward
32
+ def forward
33
+ return @forward unless @forward.nil?
34
+ @forward = ssh_forward(
35
+ admin_postgres_secret['host'],
36
+ admin_postgres_secret['port'].to_i
37
+ )
38
+ @forward
39
+ end
40
+
31
41
  # create a new postgres secret and create the according database
32
42
  def create_postgres_secret
33
- admin_secret = admin_postgres_secret
34
-
35
43
  log.info "Create secret for #{user_and_db_name} database"
36
44
  container_secret = {
37
45
  'name' => user_and_db_name,
38
46
  'user' => user_and_db_name,
39
47
  'password' => gen_password,
40
- 'host' => admin_secret['host'],
41
- 'port' => admin_secret['port']
48
+ 'host' => admin_postgres_secret['host'],
49
+ 'port' => admin_postgres_secret['port']
42
50
  }
43
51
  create_postgres_database(
44
- admin_secret,
45
52
  container_secret
46
53
  )
47
54
  create_secret(
@@ -51,39 +58,80 @@ module PicsolveDockerBuilder
51
58
  container_secret
52
59
  end
53
60
 
54
- # create postgres database
55
- # rubocop:disable Metrics/MethodLength
56
- def create_postgres_database(admin_secret, container_secret)
57
- log.info "Create database #{user_and_db_name}"
58
-
59
- forward = ssh_forward(admin_secret['host'], admin_secret['port'].to_i)
61
+ def create_admin_conn
62
+ admin_secret = admin_postgres_secret.clone
60
63
  admin_secret['host'] = '127.0.0.1'
61
64
  admin_secret['port'] = forward.local_port
65
+ log.info 'open postgres connection to ' \
66
+ "#{admin_secret['host']}:#{admin_secret['port']}" \
67
+ " with user #{admin_secret['user']}"
68
+ PG::Connection.open(admin_secret)
69
+ end
62
70
 
63
- conn = PG::Connection.open(admin_secret)
71
+ def admin_conn
72
+ @admin_conn ||= create_admin_conn
73
+ end
64
74
 
65
- user = conn.escape_string(container_secret['user'])
66
- password = conn.escape_string(container_secret['password'])
67
- name = conn.escape_string(container_secret['name'])
75
+ def admin_conn_close
76
+ admin_conn.close
77
+ @admin_conn = nil
78
+ end
79
+
80
+ # cleanup postgres database
81
+ def cleanup_postgres_database
82
+ dbname = admin_conn.escape_string(user_and_db_name)
83
+
84
+ begin
85
+ sql = "DROP DATABASE \"#{dbname}\";"
86
+ admin_conn.exec sql
87
+ log.info "removed database #{user_and_db_name}"
88
+ rescue
89
+ log.warn "removing database #{user_and_db_name} failed"
90
+ end
91
+
92
+ begin
93
+ sql = "DROP USER \"#{dbname}\";"
94
+ admin_conn.exec sql
95
+ log.info "removed user #{user_and_db_name}"
96
+ rescue
97
+ log.warn "removing user #{user_and_db_name} failed"
98
+ end
99
+
100
+ begin
101
+ delete_secret user_and_db_name
102
+ log.info "removed secret #{user_and_db_name}"
103
+ rescue
104
+ log.warn "removing secret #{user_and_db_name} failed"
105
+ end
106
+ end
107
+
108
+ # create postgres database
109
+ # rubocop:disable Metrics/MethodLength
110
+ def create_postgres_database(container_secret)
111
+ log.info "Create database #{user_and_db_name}"
112
+
113
+ user = admin_conn.escape_string(container_secret['user'])
114
+ password = admin_conn.escape_string(container_secret['password'])
115
+ name = admin_conn.escape_string(container_secret['name'])
68
116
 
69
117
  # create user
70
- conn.exec(
118
+ admin_conn.exec(
71
119
  "CREATE USER \"#{user}\" " \
72
120
  "WITH PASSWORD '#{password}'"
73
121
  )
74
122
 
75
123
  # create db
76
- conn.exec(
124
+ admin_conn.exec(
77
125
  "CREATE DATABASE \"#{name}\""
78
126
  )
79
127
 
80
128
  # grant all rights to the user and the aws user
81
- conn.exec("
129
+ admin_conn.exec("
82
130
  GRANT ALL PRIVILEGES ON DATABASE \"#{name}\" to \"#{user}\";
83
131
  GRANT ALL PRIVILEGES ON DATABASE \"#{name}\" to \"rds_superuser\";
84
132
  ")
85
133
 
86
- conn.close
134
+ admin_conn_close
87
135
 
88
136
  admin_secret['dbname'] = name
89
137
  admin_secret['user'] = user
@@ -110,7 +158,10 @@ module PicsolveDockerBuilder
110
158
 
111
159
  # get administrative postgres secrets
112
160
  def admin_postgres_secret
113
- get_secret('postgres').update('dbname' => 'postgres')
161
+ return @admin_postgres_secret unless @admin_postgres_secret.nil?
162
+ @admin_postgres_secret = get_secret('postgres')
163
+ @admin_postgres_secret.update('dbname' => 'postgres')
164
+ @admin_postgres_secret
114
165
  end
115
166
 
116
167
  def user_and_db_name
@@ -92,7 +92,6 @@ module PicsolveDockerBuilder
92
92
  def read
93
93
  @config = default
94
94
  @paths.each do |file|
95
- puts "my file is '#{@paths}'"
96
95
  begin
97
96
  yaml = Psych.load_file file
98
97
  @config = @config.deep_merge(yaml)
@@ -35,6 +35,33 @@ module PicsolveDockerBuilder
35
35
  'core'
36
36
  end
37
37
 
38
+ def cleanup
39
+ stages_allowed = %w(ci test)
40
+ unless stages_allowed.include? stage
41
+ log.error "Refuse to cleanup in stage #{stage}." \
42
+ "I only clean up in stages #{stages_allowed.join ', '}"
43
+ exit 1
44
+ end
45
+ log.info "Cleanup databases for '#{app_name}' in '#{stage}'"
46
+ rcs = []
47
+ images.each do |i|
48
+ i.requirements(self).each do |requirements|
49
+ continue unless requirements.is_a?(
50
+ PicsolveDockerBuilder::Composer::Requirements::Postgres
51
+ )
52
+ requirements.cleanup_postgres_database
53
+ end
54
+ rcs += i.rc(self).existing_rcs
55
+ end
56
+
57
+ log.info "Cleanup replication controllers for '#{app_name}' " \
58
+ "in '#{stage}'"
59
+ rcs.each do |rc|
60
+ rc.remove
61
+ rc.remove_pods_orphan
62
+ end
63
+ end
64
+
38
65
  def create_client
39
66
  Kubeclient::Client.new kubernetes_url, 'v1'
40
67
  end
@@ -1,4 +1,4 @@
1
1
  # version
2
2
  module PicsolveDockerBuilder
3
- VERSION = '0.5.1'
3
+ VERSION = '0.5.2'
4
4
  end
@@ -30,4 +30,12 @@ namespace :compose do
30
30
  require 'picsolve_docker_builder/helpers/config_version_update'
31
31
  PicsolveDockerBuilder::Helpers::ConfigVersionUpdate.update_task
32
32
  end
33
+
34
+ desc 'Cleanup databases/replication_controllers'
35
+ task :cleanup do
36
+ @docker_compose ||= PicsolveDockerBuilder::Composer::Composer.new
37
+ stage = ENV['STAGE'] || 'CI'
38
+ @docker_compose.stage = stage
39
+ @docker_compose.cleanup
40
+ end
33
41
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: picsolve_docker_builder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christian Simon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-07 00:00:00.000000000 Z
11
+ date: 2016-03-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler