Skip to content

Commit 110e270

Browse files
committed
Merge branch 'main' of giggh:gigalixir/gigalixir-cli
2 parents 36e7376 + e847465 commit 110e270

File tree

3 files changed

+119
-1
lines changed

3 files changed

+119
-1
lines changed

gigalixir/__init__.py

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ def cli(ctx, env):
219219

220220
if env == "prod":
221221
stripe.api_key = 'pk_live_45dmSl66k4xLy4X4yfF3RVpd'
222-
host = "https://api.gigalixir.com"
222+
host = os.environ.get("GIGALIXIR_CLI__HOST", "https://api.gigalixir.com")
223223
elif env == "dev":
224224
stripe.api_key = 'pk_test_6tMDkFKTz4N0wIFQZHuzOUyW'
225225
host = "http://apiserver:3200"
@@ -1162,6 +1162,48 @@ def pg_upgrade(ctx, app_name, database_id, desired_version):
11621162
"""
11631163
gigalixir_database.upgrade(ctx.obj['session'], app_name, database_id, desired_version)
11641164

1165+
@cli.command(name='pg:restart')
1166+
@click.option('-a', '--app_name', envvar="GIGALIXIR_APP")
1167+
@click.option('-d', '--database_id', required=True)
1168+
@click.option('-y', '--yes', is_flag=True)
1169+
@click.pass_context
1170+
@report_errors
1171+
@detect_app_name
1172+
def pg_restart(ctx, app_name, database_id, yes):
1173+
"""
1174+
Restart database. Find the database id by running `gigalixir pg`
1175+
"""
1176+
logging.getLogger("gigalixir-cli").info("WARNING: Restarting your database will cause temporary downtime.")
1177+
if yes or click.confirm('Do you want to restart your database?'):
1178+
gigalixir_database.restart(ctx.obj['session'], app_name, database_id)
1179+
1180+
@cli.command(name='pg:stop')
1181+
@click.option('-a', '--app_name', envvar="GIGALIXIR_APP")
1182+
@click.option('-d', '--database_id', required=True)
1183+
@click.option('-y', '--yes', is_flag=True)
1184+
@click.pass_context
1185+
@report_errors
1186+
@detect_app_name
1187+
def pg_stop(ctx, app_name, database_id, yes):
1188+
"""
1189+
Stop database. Find the database id by running `gigalixir pg`
1190+
"""
1191+
logging.getLogger("gigalixir-cli").info("WARNING: Stopping your database will make it unavailable until you start it again.")
1192+
if yes or click.confirm('Do you want to stop your database?'):
1193+
gigalixir_database.stop(ctx.obj['session'], app_name, database_id)
1194+
1195+
@cli.command(name='pg:start')
1196+
@click.option('-a', '--app_name', envvar="GIGALIXIR_APP")
1197+
@click.option('-d', '--database_id', required=True)
1198+
@click.pass_context
1199+
@report_errors
1200+
@detect_app_name
1201+
def pg_start(ctx, app_name, database_id):
1202+
"""
1203+
Start database. Find the database id by running `gigalixir pg`
1204+
"""
1205+
gigalixir_database.start(ctx.obj['session'], app_name, database_id)
1206+
11651207
@cli.command(name='stack:set')
11661208
@click.option('-a', '--app_name', envvar="GIGALIXIR_APP")
11671209
@click.option('-s', '--stack', required=True)

gigalixir/database.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,28 @@ def restore(session, app_name, database_id, backup_id):
127127
data = json.loads(r.text)["data"]
128128
presenter.echo_json(data)
129129

130+
def restart(session, app_name, database_id):
131+
r = session.put('/api/apps/%s/databases/%s/restart' % (quote(app_name.encode('utf-8')), quote(database_id.encode('utf-8'))))
132+
if r.status_code != 200:
133+
if r.status_code == 401:
134+
raise auth.AuthException()
135+
raise Exception(r.text)
136+
137+
def stop(session, app_name, database_id):
138+
r = session.put('/api/apps/%s/databases/%s/stop' % (quote(app_name.encode('utf-8')), quote(database_id.encode('utf-8'))))
139+
if r.status_code != 200:
140+
if r.status_code == 401:
141+
raise auth.AuthException()
142+
raise Exception(r.text)
143+
144+
def start(session, app_name, database_id):
145+
r = session.put('/api/apps/%s/databases/%s/start' % (quote(app_name.encode('utf-8')), quote(database_id.encode('utf-8'))))
146+
if r.status_code != 200:
147+
if r.status_code == 401:
148+
raise auth.AuthException()
149+
raise Exception(r.text)
150+
logging.getLogger("gigalixir-cli").info("Starting database. Please allow a few minutes for it to become available.")
151+
130152
def upgrade(session, app_name, database_id, desired_version):
131153
body = {
132154
"version": desired_version

test/test_gigalixir.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -678,6 +678,60 @@ def test_scale_database():
678678
expect(httpretty.has_request()).to.be.true
679679
expect(httpretty.last_request().body.decode()).to.equal('{"size": 8.0}')
680680

681+
@httpretty.activate
682+
def test_restart_database():
683+
httpretty.register_uri(httpretty.PUT, 'https://api.gigalixir.com/api/apps/fake-app-name/databases/fake-database-id/restart', body='{}', content_type='application/json')
684+
runner = CliRunner()
685+
result = runner.invoke(gigalixir.cli, ['pg:restart', '-a', 'fake-app-name', '-d', 'fake-database-id', '-y'])
686+
assert result.exit_code == 0
687+
expect(httpretty.has_request()).to.be.true
688+
689+
@httpretty.activate
690+
def test_restart_database_confirm():
691+
httpretty.register_uri(httpretty.PUT, 'https://api.gigalixir.com/api/apps/fake-app-name/databases/fake-database-id/restart', body='{}', content_type='application/json')
692+
runner = CliRunner()
693+
result = runner.invoke(gigalixir.cli, ['pg:restart', '-a', 'fake-app-name', '-d', 'fake-database-id'], input="y\n")
694+
assert result.exit_code == 0
695+
expect(httpretty.has_request()).to.be.true
696+
697+
@httpretty.activate
698+
def test_restart_database_deny():
699+
runner = CliRunner()
700+
result = runner.invoke(gigalixir.cli, ['pg:restart', '-a', 'fake-app-name', '-d', 'fake-database-id'], input="n\n")
701+
assert result.exit_code == 0
702+
expect(httpretty.has_request()).to.be.false
703+
704+
@httpretty.activate
705+
def test_stop_database():
706+
httpretty.register_uri(httpretty.PUT, 'https://api.gigalixir.com/api/apps/fake-app-name/databases/fake-database-id/stop', body='{}', content_type='application/json')
707+
runner = CliRunner()
708+
result = runner.invoke(gigalixir.cli, ['pg:stop', '-a', 'fake-app-name', '-d', 'fake-database-id', '-y'])
709+
assert result.exit_code == 0
710+
expect(httpretty.has_request()).to.be.true
711+
712+
@httpretty.activate
713+
def test_stop_database_confirm():
714+
httpretty.register_uri(httpretty.PUT, 'https://api.gigalixir.com/api/apps/fake-app-name/databases/fake-database-id/stop', body='{}', content_type='application/json')
715+
runner = CliRunner()
716+
result = runner.invoke(gigalixir.cli, ['pg:stop', '-a', 'fake-app-name', '-d', 'fake-database-id'], input="y\n")
717+
assert result.exit_code == 0
718+
expect(httpretty.has_request()).to.be.true
719+
720+
@httpretty.activate
721+
def test_stop_database_deny():
722+
runner = CliRunner()
723+
result = runner.invoke(gigalixir.cli, ['pg:stop', '-a', 'fake-app-name', '-d', 'fake-database-id'], input="n\n")
724+
assert result.exit_code == 0
725+
expect(httpretty.has_request()).to.be.false
726+
727+
@httpretty.activate
728+
def test_start_database():
729+
httpretty.register_uri(httpretty.PUT, 'https://api.gigalixir.com/api/apps/fake-app-name/databases/fake-database-id/start', body='{}', content_type='application/json')
730+
runner = CliRunner()
731+
result = runner.invoke(gigalixir.cli, ['pg:start', '-a', 'fake-app-name', '-d', 'fake-database-id'])
732+
assert result.exit_code == 0
733+
expect(httpretty.has_request()).to.be.true
734+
681735
@httpretty.activate
682736
def test_account():
683737
httpretty.register_uri(httpretty.GET, 'https://api.gigalixir.com/api/users', body='{"data":{}}', content_type='application/json')

0 commit comments

Comments
 (0)