import boto3, sys, datetime, socket def _get_boto_session(profile_name: str) -> boto3.Session: """ Get the boto3 session. Works with profile configured in runtime. :param profile_name: The configured AWS profile name. Pass in None to use default credentials chain. :returns: The Boto session. """ if profile_name == None: session = boto3.Session(region_name="ap-northeast-1") return session else: session = boto3.Session(profile_name=profile_name) return session def _check( session: boto3.Session, trainer_name: str, ): step_2_needed = None # AWS pricing for SIN c5_xlarge_instance_minute_price = 0.003266666666666667 ebs_gp2_100gb_minute_price = 0.00023148148148148146 # AWS pricing for PAX c5_xlarge_instance_minute_price = 0.0028333333333333335 ebs_gp2_100gb_minute_price = 0.00023148148148148146 # AWS pricing for NRT c5_xlarge_instance_minute_price = 0.0035666666666666668 ebs_gp2_100gb_minute_price = 0.00023148148148148146 c5_xlarge_minute_price = ( c5_xlarge_instance_minute_price + ebs_gp2_100gb_minute_price ) ec2_client = session.client("ec2") sum_cost = 0.0 instances_dict = {} response = None real_reservations = [] if trainer_name == "all": response = ec2_client.describe_instances( Filters=[ { "Name": "instance-state-name", "Values": [ "running", ], }, ], DryRun=False, MaxResults=500, ) real_reservations += [response["Reservation"]] while "NextToken" in response and response["NextToken"] != None: nt = response["NextToken"] response = ec2_client.describe_instances( Filters=[ { "Name": "instance-state-name", "Values": [ "running", ], }, ], DryRun=False, MaxResults=500, NextToken=nt, ) real_reservations += [response["Reservation"]] else: response = ec2_client.describe_instances( Filters=[ { "Name": "instance-state-name", "Values": [ "running", ], }, { "Name": "tag:trainer", "Values": [ trainer_name, ], }, ], DryRun=False, MaxResults=500, ) real_reservations += [response["Reservations"]] while "NextToken" in response and response["NextToken"] != None: nt = response["NextToken"] response = ec2_client.describe_instances( Filters=[ { "Name": "instance-state-name", "Values": [ "running", ], }, { "Name": "tag:trainer", "Values": [ trainer_name, ], }, ], DryRun=False, MaxResults=500, NextToken=nt, ) real_reservations += [response["Reservations"]] for reservations in real_reservations: for reservation in reservations: for instances in reservation["Instances"]: up_time = round( ( datetime.datetime.now(datetime.timezone.utc) - instances["UsageOperationUpdateTime"] ).seconds / 60 ) name = None trainer = None student = None node_role = None for tag in instances["Tags"]: if tag["Key"] == "Name": name = tag["Value"] if tag["Key"] == "trainer": trainer = tag["Value"] if tag["Key"] == "student": student = tag["Value"] if tag["Key"] == "role": node_role = tag["Value"] if ( name == None or trainer == None or student == None or node_role == None ) and (name != "lab-control"): step_2_needed = "Setup In-Progress ..." cost = 0.0 cost = round(up_time * c5_xlarge_minute_price, 2) if name != "lab-control": sum_cost += cost instances_dict.update( { (trainer if trainer != None else " ") + ":" + (student if student != None else " ") + ":" + (node_role if node_role != None else " ") + ":" + instances["InstanceId"]: "
| Instance ID | Public IP | Private IP | Suggested Role | Instructor | Student | Name | Up Time (mins) | " ) print("
|---|
Reporting at - (UTC) " + str(datetime.datetime.now()), "with", str(len([*instances_dict])), "nodes.
", ) if len([*instances_dict]) == 0: print( 'Choose an "Exercise" to start your lab.
' ) if m_public_ip != "monitor1_address": print("") if "None" not in pd_dashboard_url: print( '
PD Dashboard - ' + pd_dashboard_url + "" ) monitor_ip = m_public_ip.strip() grafana_port = 3000 timeout_seconds = 1 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(timeout_seconds) result = sock.connect_ex((monitor_ip, int(grafana_port))) if result == 0: print( '
Grafana Dashboard - http://' + monitor_ip + ":3000" ) sock.close() print("") else: print( '
Nodes are not ready for deploying TiDB yet.
' ) print( ' Steps for connecting to control machine: When the environment is ready, follow the steps below to log in to node monitor1, the Control Machine. (More details or Windows laptop users refer to this guide.)
'
)
print(
' 1. Secure the downloaded TiUP Control Machine private key: chmod 400 pe-class-key-tokyo.pem'
)
print(
" 2. Make sure the ssh-agent is running."
)
print(
' 3. Add identity to authentication agent: ssh-add pe-class-key-tokyo.pem'
)
print(
" 4. SSH log in to the TiUP Control Machine: ssh -A -o ServerAliveInterval=30 -o ServerAliveCountMax=5 ec2-user@"
+ m_public_ip
+ "
",
)
if __name__ == "__main__":
trainer_name = sys.argv[1]
pd_dashboard_url = sys.argv[2]
session = _get_boto_session(None)
_check(session, trainer_name)