def test_register(self): appscale_yaml = {'keyname': 'boo'} deployment = { 'name': 'bar', 'deployment_id': 'baz', 'nodes': [{ 'public_ip': 'public1', 'jobs': ['shadow'] }] } flexmock(AppScale).should_receive('read_appscalefile')\ .and_return(yaml.dump(appscale_yaml)) flexmock(yaml).should_receive('safe_load').and_return( {'keyname': 'boo'}) flexmock(AppScale).should_receive('get_nodes')\ .and_return(deployment['nodes']) flexmock(AppScale).should_receive('get_head_node')\ .and_return(deployment['nodes'][0]) flexmock(RegistrationHelper).should_receive('update_deployment') \ .and_return(deployment) flexmock(RegistrationHelper).should_receive('set_deployment_id') \ .and_return() appscale = AppScale() # If the deployment already has an ID and it differs from the one given, # the tools should raise an AppScaleException. existing_deployment_id = 'blarg' flexmock(RegistrationHelper).should_receive('appscale_has_deployment_id')\ .and_return(True) flexmock(RegistrationHelper).should_receive('get_deployment_id')\ .and_return(existing_deployment_id) with self.assertRaises(AppScaleException): appscale.register(deployment['deployment_id']) # If the existing deployment ID is the same as the given deployment ID, # the tools should try to complete the registration with the portal. existing_deployment_id = 'baz' flexmock(RegistrationHelper).should_receive('get_deployment_id') \ .and_return(existing_deployment_id) appscale.register(deployment['deployment_id']) # If the deployment does not have an ID set, the tools should try to # complete the registration. flexmock(RegistrationHelper).should_receive('appscale_has_deployment_id')\ .and_return(False) appscale.register(deployment['deployment_id'])
def test_register(self): appscale_yaml = {'keyname': 'boo'} deployment = { 'name': 'bar', 'deployment_id': 'baz', 'nodes': [{'public_ip': 'public1', 'jobs': ['shadow']}] } flexmock(AppScale).should_receive('read_appscalefile')\ .and_return(yaml.dump(appscale_yaml)) flexmock(yaml).should_receive('safe_load').and_return({'keyname': 'boo'}) flexmock(AppScale).should_receive('get_nodes')\ .and_return(deployment['nodes']) flexmock(AppScale).should_receive('get_head_node')\ .and_return(deployment['nodes'][0]) flexmock(RegistrationHelper).should_receive('update_deployment') \ .and_return(deployment) flexmock(RegistrationHelper).should_receive('set_deployment_id') \ .and_return() appscale = AppScale() # If the deployment already has an ID and it differs from the one given, # the tools should raise an AppScaleException. existing_deployment_id = 'blarg' flexmock(RegistrationHelper).should_receive('appscale_has_deployment_id')\ .and_return(True) flexmock(RegistrationHelper).should_receive('get_deployment_id')\ .and_return(existing_deployment_id) with self.assertRaises(AppScaleException): appscale.register(deployment['deployment_id']) # If the existing deployment ID is the same as the given deployment ID, # the tools should try to complete the registration with the portal. existing_deployment_id = 'baz' flexmock(RegistrationHelper).should_receive('get_deployment_id') \ .and_return(existing_deployment_id) appscale.register(deployment['deployment_id']) # If the deployment does not have an ID set, the tools should try to # complete the registration. flexmock(RegistrationHelper).should_receive('appscale_has_deployment_id')\ .and_return(False) appscale.register(deployment['deployment_id'])
def main(): """ Execute appscale script. """ appscale = AppScale() if len(sys.argv) < 2: print(AppScale.USAGE) sys.exit(1) command = sys.argv[1] if command == "init": if len(sys.argv) < 2: cprint("Usage: appscale init [cloud | cluster]", 'red') print("Specify 'cloud' for EC2, Eucalyptus, and Google Compute Engine " + "deployments, and 'cluster' if running over a virtualized cluster.") sys.exit(1) try: environment = sys.argv[2] if len(sys.argv) == 3 else None appscale.init(environment) except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) cprint("AppScalefile successfully created! Be sure to " + "customize it for your particular cloud or cluster.", 'green') sys.exit(0) elif command == "up": try: appscale.up() except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command == "services": try: services.main() except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command == "ssh": if len(sys.argv) < 3: index = None else: index = sys.argv[2] try: appscale.ssh(index) except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) except KeyboardInterrupt: # don't print the stack trace on a Control-C pass elif command == "stats": try: appscale.stats(sys.argv[2:]) except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command == "status": try: appscale.status(sys.argv[2:]) except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command == "deploy": try: if len(sys.argv) < 3 or len(sys.argv) > 5: cprint("Usage: appscale deploy [--project <id>] <path to your app>", 'red') sys.exit(1) if len(sys.argv) == 3: appscale.deploy(sys.argv[2]) elif len(sys.argv) == 5: if sys.argv[2] != '--project': cprint("Usage: appscale deploy [--project <id>] <path to your app>", 'red') sys.exit(1) appscale.deploy(sys.argv[4], sys.argv[3]) except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command == "create-user": try: if len(sys.argv) < 2 or len(sys.argv) > 3: cprint("Usage: appscale create-user [--admin]", 'red') sys.exit(1) if len(sys.argv) == 3: if sys.argv[2] == '--admin': appscale.create_user(True) else: cprint("Error: Invalid argument to 'create-user' command. To create user as admin, " "you should specify the option '--admin'", 'red') cprint("Usage: appscale create-user --admin", 'red') sys.exit(1) elif len(sys.argv) == 2: appscale.create_user() except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command == "undeploy" or command == "remove": try: if len(sys.argv) != 3: cprint("Usage: appscale {0} <path to your app>".format(command), 'red') sys.exit(1) appscale.undeploy(sys.argv[2]) except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command == "get": try: if len(sys.argv) != 3: cprint("Usage: appscale get <regex of properties to retrieve>", 'red') sys.exit(1) properties = appscale.get(sys.argv[2]) for property_name, property_value in sorted(properties.iteritems()): print "{0} -> {1}".format(property_name, property_value) sys.exit(0) except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command == "set": try: if len(sys.argv) != 4: cprint("Usage: appscale set <property> <value>", 'red') sys.exit(1) appscale.set(sys.argv[2], sys.argv[3]) except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command == "tail": if len(sys.argv) < 3: # by default, tail the first node's logs, since that node is # typically the head node index = 0 else: index = sys.argv[2] if len(sys.argv) < 4: # by default, tail the AppController logs, since that's the # service we most often tail from regex = "controller*" else: regex = sys.argv[3] try: appscale.tail(index, regex) except KeyboardInterrupt: # don't print the stack trace on a Control-C pass except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command == "logs": if len(sys.argv) < 3: cprint("Usage: appscale logs <location to copy logs to>", 'red') sys.exit(1) try: appscale.logs(sys.argv[2], sys.argv[3:]) except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command == "destroy": cprint("Warning: destroy has been deprecated. Please use 'down'.", 'red') sys.exit(1) elif command == "clean": cprint("Warning: clean has been deprecated. Please use 'down --clean'.", 'red') sys.exit(1) elif command == "down": if len(sys.argv) > 4: cprint("Usage: appscale down [--clean][--terminate]", 'red') sys.exit(1) to_clean = False to_terminate = False for index in range(2, len(sys.argv)): if sys.argv[index] == "--terminate": to_terminate = True elif sys.argv[index] == "--clean": to_clean = True else: cprint("Usage: appscale down [--clean][--terminate]", 'red') sys.exit(1) try: appscale.down(clean=to_clean, terminate=to_terminate) except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command == "relocate": if len(sys.argv) != 5: cprint("Usage: appscale relocate appid http_port https_port", 'red') sys.exit(1) try: appscale.relocate(sys.argv[2], sys.argv[3], sys.argv[4]) except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command == "register": try: if len(sys.argv) != 3: cprint("Usage: appscale register <deployment ID>", "red") print("You can obtain a deployment ID from {0}" .format(RegistrationHelper.ADD_DEPLOYMENT_URL)) sys.exit(1) appscale.register(sys.argv[2]) except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command in ["--version", "-v"]: print APPSCALE_VERSION sys.exit(0) elif command == "upgrade": try: appscale.upgrade() except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) else: print(AppScale.USAGE) if command == "help": sys.exit(0) else: sys.exit(1)
def main(): """ Execute appscale script. """ appscale = AppScale() if len(sys.argv) < 2: print(AppScale.USAGE) sys.exit(1) command = sys.argv[1] if command == "init": if len(sys.argv) < 2: cprint("Usage: appscale init [cloud | cluster]", 'red') print( "Specify 'cloud' for EC2, Eucalyptus, and Google Compute Engine " + "deployments, and 'cluster' if running over a virtualized cluster." ) sys.exit(1) try: environment = sys.argv[2] if len(sys.argv) == 3 else None appscale.init(environment) except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) cprint( "AppScalefile successfully created! Be sure to " + "customize it for your particular cloud or cluster.", 'green') sys.exit(0) elif command == "up": update_dir = [] if len(sys.argv) > 2: if sys.argv[2] != '--update': cprint( "Usage: appscale up [--update] <code directory to update>", 'red') sys.exit(1) if len(sys.argv) < 4: cprint( "Usage: appscale up [--update] <code directory to update>", 'red') cprint("Please specify the code directory to update and build", 'red') update_dir = sys.argv[3:] try: appscale.up(update=update_dir) except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command == "services": try: services.main() except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command == "ssh": if len(sys.argv) < 3: index = None else: index = sys.argv[2] try: appscale.ssh(index) except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) except KeyboardInterrupt: # don't print the stack trace on a Control-C pass elif command == "stats": try: appscale.stats(sys.argv[2:]) except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command == "status": try: appscale.status(sys.argv[2:]) except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command == "deploy": try: if len(sys.argv) < 3 or len(sys.argv) > 5: cprint( "Usage: appscale deploy [--project <id>] <path to your app>", 'red') sys.exit(1) if len(sys.argv) == 3: appscale.deploy(sys.argv[2]) elif len(sys.argv) == 5: if sys.argv[2] != '--project': cprint( "Usage: appscale deploy [--project <id>] <path to your app>", 'red') sys.exit(1) appscale.deploy(sys.argv[4], sys.argv[3]) except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command == "create-user": try: if len(sys.argv) < 2 or len(sys.argv) > 3: cprint("Usage: appscale create-user [--admin]", 'red') sys.exit(1) if len(sys.argv) == 3: if sys.argv[2] == '--admin': appscale.create_user(True) else: cprint( "Error: Invalid argument to 'create-user' command. To create user as admin, " "you should specify the option '--admin'", 'red') cprint("Usage: appscale create-user --admin", 'red') sys.exit(1) elif len(sys.argv) == 2: appscale.create_user() except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command == "undeploy" or command == "remove": try: if len(sys.argv) != 3: cprint( "Usage: appscale {0} <path to your app>".format(command), 'red') sys.exit(1) appscale.undeploy(sys.argv[2]) except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command == "get": try: if len(sys.argv) != 3: cprint("Usage: appscale get <regex of properties to retrieve>", 'red') sys.exit(1) properties = appscale.get(sys.argv[2]) for property_name, property_value in sorted( properties.iteritems()): print "{0} -> {1}".format(property_name, property_value) sys.exit(0) except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command == "set": try: if len(sys.argv) != 4: cprint("Usage: appscale set <property> <value>", 'red') sys.exit(1) appscale.set(sys.argv[2], sys.argv[3]) except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command == "tail": if len(sys.argv) < 3: # by default, tail the first node's logs, since that node is # typically the head node index = 0 else: index = sys.argv[2] if len(sys.argv) < 4: # by default, tail the AppController logs, since that's the # service we most often tail from regex = "controller*" else: regex = sys.argv[3] try: appscale.tail(index, regex) except KeyboardInterrupt: # don't print the stack trace on a Control-C pass except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command == "logs": if len(sys.argv) < 3: cprint("Usage: appscale logs <location to copy logs to>", 'red') sys.exit(1) try: appscale.logs(sys.argv[2], sys.argv[3:]) except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command == "destroy": cprint("Warning: destroy has been deprecated. Please use 'down'.", 'red') sys.exit(1) elif command == "clean": cprint( "Warning: clean has been deprecated. Please use 'down --clean'.", 'red') sys.exit(1) elif command == "down": if len(sys.argv) > 4: cprint("Usage: appscale down [--clean][--terminate]", 'red') sys.exit(1) to_clean = False to_terminate = False for index in range(2, len(sys.argv)): if sys.argv[index] == "--terminate": to_terminate = True elif sys.argv[index] == "--clean": to_clean = True else: cprint("Usage: appscale down [--clean][--terminate]", 'red') sys.exit(1) try: appscale.down(clean=to_clean, terminate=to_terminate) except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command == "relocate": if len(sys.argv) != 5: cprint("Usage: appscale relocate appid http_port https_port", 'red') sys.exit(1) try: appscale.relocate(sys.argv[2], sys.argv[3], sys.argv[4]) except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command == "register": try: if len(sys.argv) != 3: cprint("Usage: appscale register <deployment ID>", "red") print("You can obtain a deployment ID from {0}".format( RegistrationHelper.ADD_DEPLOYMENT_URL)) sys.exit(1) appscale.register(sys.argv[2]) except Exception as exception: LocalState.generate_crash_log(exception, traceback.format_exc()) sys.exit(1) elif command in ["--version", "-v"]: print APPSCALE_VERSION sys.exit(0) else: print(AppScale.USAGE) if command == "help": sys.exit(0) else: sys.exit(1)