copr-builders: better s390x Floating IP allocation
This commit is contained in:
parent
38151a6e5c
commit
75b2d1aee6
1 changed files with 52 additions and 11 deletions
|
@ -36,22 +36,25 @@ def resalloc_to_ibmcloud_name(name):
|
||||||
return name.replace("_", "-")
|
return name.replace("_", "-")
|
||||||
|
|
||||||
|
|
||||||
def bind_floating_ip(service, instance_id, log):
|
def bind_floating_ip(service, instance_id, opts, log):
|
||||||
"""
|
"""
|
||||||
Assign an existing Floating IP to given instance.
|
Assign an existing Floating IP to given instance.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
log.info("Bind floating IP")
|
log.info("Bind floating IP")
|
||||||
response_list = service.list_floating_ips().get_result()['floating_ips']
|
response_list = service.list_floating_ips().get_result()['floating_ips']
|
||||||
floating_ip_id = None
|
floating_ip_uuid = None
|
||||||
for item in response_list:
|
for item in response_list:
|
||||||
log.info("%s\t%s\t%s", item['id'], item['name'], item['status'])
|
if item["name"] != opts.floating_ip_name:
|
||||||
if item["status"] == "available":
|
continue
|
||||||
floating_ip_id = item['id']
|
if item["status"] != "available":
|
||||||
floating_ip_address = item['address']
|
log.error("Floating IP %s is already used", opts.floating_ip_name)
|
||||||
break
|
sys.exit(1)
|
||||||
if floating_ip_id is None:
|
floating_ip_uuid = item['id']
|
||||||
log.error("No available floating IP")
|
floating_ip_address = item['address']
|
||||||
|
|
||||||
|
if floating_ip_uuid is None:
|
||||||
|
log.error("UUID for Floating IP %s not found", opts.floating_ip_name)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
response_list = service.list_instance_network_interfaces(instance_id)
|
response_list = service.list_instance_network_interfaces(instance_id)
|
||||||
|
@ -64,7 +67,7 @@ def bind_floating_ip(service, instance_id, log):
|
||||||
service.add_instance_network_interface_floating_ip(
|
service.add_instance_network_interface_floating_ip(
|
||||||
instance_id,
|
instance_id,
|
||||||
network_interface_id,
|
network_interface_id,
|
||||||
floating_ip_id,
|
floating_ip_uuid,
|
||||||
)
|
)
|
||||||
log.info("Floating IP: %s", floating_ip_address)
|
log.info("Floating IP: %s", floating_ip_address)
|
||||||
return floating_ip_address
|
return floating_ip_address
|
||||||
|
@ -129,7 +132,7 @@ def create_instance(service, instance_name, opts, log):
|
||||||
log.debug("Instance response[get_result]: %s", response.get_result())
|
log.debug("Instance response[get_result]: %s", response.get_result())
|
||||||
instance_id = response.get_result()['id']
|
instance_id = response.get_result()['id']
|
||||||
log.info("Instance ID: %s", instance_id)
|
log.info("Instance ID: %s", instance_id)
|
||||||
ip_address = bind_floating_ip(service, instance_id, log)
|
ip_address = bind_floating_ip(service, instance_id, opts, log)
|
||||||
_wait_for_ssh(ip_address)
|
_wait_for_ssh(ip_address)
|
||||||
run_playbook(ip_address, opts)
|
run_playbook(ip_address, opts)
|
||||||
# Tell the Resalloc clients how to connect to this instance.
|
# Tell the Resalloc clients how to connect to this instance.
|
||||||
|
@ -165,6 +168,7 @@ def _get_arg_parser():
|
||||||
parser_create.add_argument("name")
|
parser_create.add_argument("name")
|
||||||
parser_create.add_argument("--playbook", default=DEFAULT_PLAYBOOK)
|
parser_create.add_argument("--playbook", default=DEFAULT_PLAYBOOK)
|
||||||
parser_create.add_argument("--image-uuid", default=DEFAULT_IMAGE)
|
parser_create.add_argument("--image-uuid", default=DEFAULT_IMAGE)
|
||||||
|
parser_create.add_argument("--floating-ip-name", default=None)
|
||||||
parser_delete = subparsers.add_parser(
|
parser_delete = subparsers.add_parser(
|
||||||
"delete", help="Delete instance by it's name from IBM Cloud")
|
"delete", help="Delete instance by it's name from IBM Cloud")
|
||||||
parser_delete.add_argument("name")
|
parser_delete.add_argument("name")
|
||||||
|
@ -179,11 +183,44 @@ def _wait_for_ssh(floating_ip):
|
||||||
subprocess.check_call(cmd)
|
subprocess.check_call(cmd)
|
||||||
|
|
||||||
|
|
||||||
|
def detect_floating_ip_name(opts):
|
||||||
|
"""
|
||||||
|
We allocate Floating IPS in intervals for each instance.
|
||||||
|
Production:
|
||||||
|
- 000-099
|
||||||
|
- currently we allocate at most 8-16 instances
|
||||||
|
Devel
|
||||||
|
- 100-199
|
||||||
|
- currently we allocate 1 to 2 instances
|
||||||
|
Manual starting (not via resalloc) (use --floating-ip-name copr-builder-NNN)
|
||||||
|
- 200-201
|
||||||
|
Since we only allocate at most 16+2+2, we have 20 IPs pre-allocated
|
||||||
|
"forever" in the IBM Cloud API. If you increase the numbers, go to the web
|
||||||
|
UI and reserve more.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# set by command line option?
|
||||||
|
if opts.floating_ip_name:
|
||||||
|
return
|
||||||
|
|
||||||
|
id_in_pool = os.environ.get("RESALLOC_ID_IN_POOL", -1)
|
||||||
|
if id_in_pool == -1:
|
||||||
|
opts.log.error("Please specify --floating-ip-name, or RESALLOC_ID_IN_POOL")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
if opts.instance == "devel":
|
||||||
|
id_in_pool += 100
|
||||||
|
|
||||||
|
opts.floating_ip_name = "copr-builder-{}".format(id_in_pool.zfill(3))
|
||||||
|
opts.log.info("Using Floating IP copr-builder-%s", opts.floating_ip_id)
|
||||||
|
|
||||||
|
|
||||||
def _main():
|
def _main():
|
||||||
opts = _get_arg_parser().parse_args()
|
opts = _get_arg_parser().parse_args()
|
||||||
log_level = getattr(logging, opts.log_level.upper())
|
log_level = getattr(logging, opts.log_level.upper())
|
||||||
logging.basicConfig(format='%(levelname)s: %(message)s', level=log_level)
|
logging.basicConfig(format='%(levelname)s: %(message)s', level=log_level)
|
||||||
log = logging.getLogger()
|
log = logging.getLogger()
|
||||||
|
opts.log = log
|
||||||
|
|
||||||
cmd = "source {} ; echo $IBMCLOUD_API_KEY".format(
|
cmd = "source {} ; echo $IBMCLOUD_API_KEY".format(
|
||||||
pipes.quote(opts.token_file))
|
pipes.quote(opts.token_file))
|
||||||
|
@ -199,6 +236,10 @@ def _main():
|
||||||
|
|
||||||
name = resalloc_to_ibmcloud_name(opts.name)
|
name = resalloc_to_ibmcloud_name(opts.name)
|
||||||
|
|
||||||
|
opts.instance = "production" if "-prod-" in name else "devel"
|
||||||
|
|
||||||
|
detect_floating_ip_name(opts)
|
||||||
|
|
||||||
if opts.subparser == "create":
|
if opts.subparser == "create":
|
||||||
create_instance(service, name, opts, log)
|
create_instance(service, name, opts, log)
|
||||||
elif opts.subparser == "delete":
|
elif opts.subparser == "delete":
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue