seira 0.1.5 → 0.1.6
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 +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
|