seira 0.1.5 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +42 -3
- data/lib/seira/app.rb +7 -1
- data/lib/seira/pods.rb +33 -16
- data/lib/seira/secrets.rb +17 -4
- data/lib/seira/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2139b5d967293724e307e500bd87c3a77998f563
|
4
|
+
data.tar.gz: 5eb1767a8f7c23a6dad5357823fd651d5089e21d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 38121663c35640ef9a8f6c2180965197f088b46ed609a0ea122b301907653b69ae93c7e13d164868f1d4c21ac71964e4f281323a916352f34a3186e63950c63b
|
7
|
+
data.tar.gz: d167aa0f6e90e6130e42721b0240867ed03d9cdcbaa13c245eb86ca29a45e4baf3dc7845e076152a178238b43e5d4e74cc408ad8674c506f51685f61040c720b
|
data/README.md
CHANGED
@@ -33,7 +33,7 @@ The `gem install seira` option may be preferred for shorter typing, or generatin
|
|
33
33
|
|
34
34
|
## Usage
|
35
35
|
|
36
|
-
This library only currently works with `gcloud` and `kubectl`, meaning Google
|
36
|
+
This library only currently works with `gcloud` and `kubectl`, meaning Google Cloud Platform and Kubernetes.
|
37
37
|
|
38
38
|
All commands follow a pattern:
|
39
39
|
|
@@ -79,7 +79,7 @@ This specification is read in and used to determine what `gcloud` context to use
|
|
79
79
|
|
80
80
|
### Manifest Files
|
81
81
|
|
82
|
-
Seira expects your Kubernetes manifests to exist in the "kubernetes
|
82
|
+
Seira expects your Kubernetes manifests to exist in the "kubernetes/cluster-name/app-name" directory. When a deploy is run on `foo` app in `staging` cluster, it looks to `kubernetes/staging/foo` directory for the manifest files.
|
83
83
|
|
84
84
|
### Assumptions
|
85
85
|
|
@@ -91,7 +91,46 @@ Seira expects your Kubernetes manifests to exist in the "kubernetes/<cluster>/<a
|
|
91
91
|
|
92
92
|
In order to use Seira, an initial setup is needed. Use the `seira setup` command to set up each of your clusters in your configuration file.
|
93
93
|
|
94
|
-
##
|
94
|
+
## Current Functionality
|
95
|
+
|
96
|
+
All functionality is targeted to be a platform on top of Kubernetes that has a Heroku-like experience.
|
97
|
+
|
98
|
+
### App
|
99
|
+
|
100
|
+
* Bootstrap new applications
|
101
|
+
* Apply new configurations to an application
|
102
|
+
* Scale app tiers
|
103
|
+
* Restart an application
|
104
|
+
|
105
|
+
### Database (Postgres)
|
106
|
+
|
107
|
+
* List postgres instances
|
108
|
+
* Create new primary and automatically set the right secrets with configurability such as HA, CPU, Memory.
|
109
|
+
* Create a new replica on the primary
|
110
|
+
* Pgbouncer yaml generation for all new instances
|
111
|
+
* Delete an instance
|
112
|
+
|
113
|
+
### Memcached
|
114
|
+
|
115
|
+
* List, delete memcached instances
|
116
|
+
* Create new memcached instances with configurable CPU and Memory using Helm.
|
117
|
+
|
118
|
+
### Redis
|
119
|
+
|
120
|
+
* List, delete Redis instances
|
121
|
+
* Create new Redis instances with configurable CPU and Memory using Helm.
|
122
|
+
|
123
|
+
### Pods
|
124
|
+
|
125
|
+
* List pods for a given app
|
126
|
+
* Connect to a running pod to run commands
|
127
|
+
* Run a one-off command such as `rails db:migrate`
|
128
|
+
|
129
|
+
### Secrets
|
130
|
+
|
131
|
+
* List, set, unset secrets
|
132
|
+
|
133
|
+
## Example Usage
|
95
134
|
|
96
135
|
### Running Proxy UI
|
97
136
|
|
data/lib/seira/app.rb
CHANGED
@@ -52,6 +52,9 @@ module Seira
|
|
52
52
|
private
|
53
53
|
|
54
54
|
def run_bootstrap
|
55
|
+
# TODO: Verify that 00-namespace exists
|
56
|
+
# TODO: Do conformance test on the yaml files before running anything, including that 00-namespace.yaml exists and has right name
|
57
|
+
system("kubectl apply -f kubernetes/#{context[:cluster]}/#{app}/00-namespace.yaml") # Create namespace before anything else
|
55
58
|
bootstrap_main_secret
|
56
59
|
bootstrap_cloudsql_secret
|
57
60
|
bootstrap_gcr_secret
|
@@ -71,7 +74,10 @@ module Seira
|
|
71
74
|
revision = current_revision
|
72
75
|
end
|
73
76
|
|
74
|
-
replacement_hash = {
|
77
|
+
replacement_hash = {
|
78
|
+
'REVISION' => revision,
|
79
|
+
'RESTARTED_AT_VALUE' => "Initial Deploy for #{revision}"
|
80
|
+
}
|
75
81
|
|
76
82
|
if restart
|
77
83
|
replacement_hash['RESTARTED_AT_VALUE'] = Time.now.to_s
|
data/lib/seira/pods.rb
CHANGED
@@ -75,6 +75,8 @@ module Seira
|
|
75
75
|
# Set defaults
|
76
76
|
tier = 'web'
|
77
77
|
clear_commands = false
|
78
|
+
detached = false
|
79
|
+
container_name = app
|
78
80
|
|
79
81
|
# Loop through args and process any that aren't just the command to run
|
80
82
|
loop do
|
@@ -86,8 +88,12 @@ module Seira
|
|
86
88
|
break unless arg.start_with? '--'
|
87
89
|
if arg.start_with? '--tier='
|
88
90
|
tier = arg.split('=')[1]
|
89
|
-
elsif arg
|
90
|
-
clear_commands =
|
91
|
+
elsif arg == '--clear-commands'
|
92
|
+
clear_commands = true
|
93
|
+
elsif arg == '--detached'
|
94
|
+
detached = true
|
95
|
+
elsif arg.start_with? '--container='
|
96
|
+
container_name = arg.split('=')[1]
|
91
97
|
else
|
92
98
|
puts "Warning: Unrecognized argument #{arg}"
|
93
99
|
end
|
@@ -122,28 +128,39 @@ module Seira
|
|
122
128
|
end
|
123
129
|
end
|
124
130
|
|
131
|
+
if detached
|
132
|
+
target_container = spec['containers'].find { |container| container['name'] == container_name }
|
133
|
+
if target_container.nil?
|
134
|
+
puts "Could not find container '#{container_name}' to run command in"
|
135
|
+
exit(1)
|
136
|
+
end
|
137
|
+
target_container['command'] = ['bash', '-c', command]
|
138
|
+
end
|
139
|
+
|
125
140
|
puts "Creating temporary pod #{temp_name}"
|
126
141
|
unless system("kubectl --namespace=#{app} create -f - <<JSON\n#{temp_pod.to_json}\nJSON")
|
127
142
|
puts 'Failed to create pod'
|
128
143
|
exit(1)
|
129
144
|
end
|
130
145
|
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
146
|
+
unless detached
|
147
|
+
# Check pod status until it's ready to connect to
|
148
|
+
print 'Waiting for pod to start...'
|
149
|
+
loop do
|
150
|
+
pod = JSON.parse(`kubectl --namespace=#{app} get pods/#{temp_name} -o json`)
|
151
|
+
break if pod['status']['phase'] == 'Running'
|
152
|
+
print '.'
|
153
|
+
sleep 1
|
154
|
+
end
|
155
|
+
print "\n"
|
140
156
|
|
141
|
-
|
142
|
-
|
157
|
+
# Connect to the pod, running the specified command
|
158
|
+
connect_to_pod(temp_name, command)
|
143
159
|
|
144
|
-
|
145
|
-
|
146
|
-
|
160
|
+
# Clean up
|
161
|
+
unless system("kubectl --namespace=#{app} delete pod #{temp_name}")
|
162
|
+
puts "Warning: failed to clean up pod #{temp_name}"
|
163
|
+
end
|
147
164
|
end
|
148
165
|
end
|
149
166
|
|
data/lib/seira/secrets.rb
CHANGED
@@ -8,7 +8,7 @@ require 'base64'
|
|
8
8
|
# TODO: Can we avoid writing to disk completely and instead pipe in raw json?
|
9
9
|
module Seira
|
10
10
|
class Secrets
|
11
|
-
VALID_ACTIONS = %w[help get set unset list list-decoded
|
11
|
+
VALID_ACTIONS = %w[help get set unset list list-decoded].freeze
|
12
12
|
PGBOUNCER_SECRETS_NAME = 'pgbouncer-secrets'.freeze
|
13
13
|
SUMMARY = "Manage your application's secrets and environment variables.".freeze
|
14
14
|
|
@@ -65,7 +65,8 @@ module Seira
|
|
65
65
|
|
66
66
|
def get(key)
|
67
67
|
secrets = fetch_current_secrets
|
68
|
-
|
68
|
+
encoded_value = secrets.dig('data', key)
|
69
|
+
encoded_value.nil? ? nil : Base64.decode64(encoded_value)
|
69
70
|
end
|
70
71
|
|
71
72
|
private
|
@@ -73,7 +74,14 @@ module Seira
|
|
73
74
|
def run_help
|
74
75
|
puts SUMMARY
|
75
76
|
puts "\n\n"
|
76
|
-
puts "
|
77
|
+
puts "Possible actions:\n\n"
|
78
|
+
puts "get: fetch the value of a secret: `secrets get PASSWORD`"
|
79
|
+
puts "set: set one or more secret values: `secrets set USERNAME=admin PASSWORD=asdf`"
|
80
|
+
puts " to specify a value with spaces: `secrets set LIPSUM=\"Lorem ipsum\"`"
|
81
|
+
puts " to specify a value with newlines: `secrets set RSA_KEY=\"$(cat key.pem)\"`"
|
82
|
+
puts "unset: remove a secret: `secrets unset PASSWORD`"
|
83
|
+
puts "list: list all secret keys and values"
|
84
|
+
puts "list: list all secret keys and values, and decode from base64"
|
77
85
|
end
|
78
86
|
|
79
87
|
def validate_single_key
|
@@ -91,7 +99,12 @@ module Seira
|
|
91
99
|
end
|
92
100
|
|
93
101
|
def run_get
|
94
|
-
|
102
|
+
value = get(key)
|
103
|
+
if value.nil?
|
104
|
+
puts "Secret '#{key}' not found"
|
105
|
+
else
|
106
|
+
puts "#{key}: #{value}"
|
107
|
+
end
|
95
108
|
end
|
96
109
|
|
97
110
|
def run_set
|
data/lib/seira/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: seira
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Scott Ringwelski
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-01-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: highline
|