Untitled
unknown
plain_text
2 years ago
6.1 kB
9
Indexable
import boto3
import time
from playwright.sync_api import Playwright, sync_playwright
from ec2_metadata import ec2_metadata
def fetch_tags(instance_id: str, aws_region: str) -> str:
ec2 = boto3.client('ec2')
# Retrieve information about the specified instance
response = ec2.describe_instances(InstanceIds=[instance_id])
# Extract the 'Tags' information
tags = response['Reservations'][0]['Instances'][0].get('Tags', [])
# Convert list of tags to a dictionary for easy access
tag_dict = {tag['Key']: tag['Value'] for tag in tags}
# Check for required tags
required_tags = ['app_name', 'environment']
for tag in required_tags:
if tag not in tag_dict:
raise ValueError(f"Tag '{tag}' not found in instance {instance_id}")
return tag_dict
def get_ssm_parameter(parameter_name: str, aws_region: str) -> str:
ssm_client = boto3.client('ssm', region_name=aws_region)
response = ssm_client.get_parameter(Name=parameter_name, WithDecryption=True)
return response['Parameter']['Value']
def deploy(playwright: Playwright, app_name: str, environment: str, aws_region: str) -> None:
# Construct the SSM Parameter Store prefix path
ssm_parameter_prefix = f"/{app_name}/{environment}/"
# Define a list of parameters to be fetched from SSM Parameter Store
ssm_parameters = [
"admin_password",
"admin_security_question_answer",
"vm_minimum_heap_size",
"vm_maximum_heap_size",
"db_name",
"db_hostname",
"db_port",
"db_username",
"db_password"
]
# Fetch the values of the parameters from SSM Parameter Store
ssm_parameter_values = {parameter: get_ssm_parameter(ssm_parameter_prefix + parameter, aws_region) for parameter in ssm_parameters}
print("Running automation script to deploy FlexNet Operations.")
# Launch the Chromium browser in headless mode
browser = playwright.chromium.launch(headless=True)
# Create a new browser context
context = browser.new_context()
# Create a new page in the context
page = context.new_page()
# Go to the FlexNet Operations setup page
print("Logging into the FlexNet Operations Setup WebUI...")
page.goto("http://localhost:4321/flexnetsetup")
# Fill in the username and password fields
page.get_by_placeholder("Username").fill("admin")
page.get_by_placeholder("Password").fill("admin")
# Click the "Log in" button
page.get_by_role("button", name="Log in").click()
# Fill in the existing password, new password, and confirm password fields
print("Changing password of admin user...")
page.get_by_placeholder("Existing Password").fill("admin")
page.get_by_placeholder("New Password").fill(ssm_parameter_values["admin_password"])
page.get_by_placeholder("Confirm Password").fill(ssm_parameter_values["admin_password"])
# Select a security question and provide an answer
page.locator("#question").select_option("What was the name of your first school?")
page.locator("input[name=\"answer\"]").fill(ssm_parameter_values["admin_security_question_answer"])
# Click the "Change" button to change the password
page.get_by_role("button", name="Change").click()
print("Logged in, Configuring FlexNet Operations...")
# Fill in the VM Heap Size and VM Size Maximum fields
page.get_by_label("VM Heap Size (MB)").fill(ssm_parameter_values["vm_minimum_heap_size"])
page.locator("input[name=\"vmSizeMaximum\"]").fill(ssm_parameter_values["vm_maximum_heap_size"])
# Check the "Install as Service" and "Use Local System Account" checkboxes
page.locator("#fnoServiceInstallAsService").check()
page.locator("#fnoServiceUseLocalSystemAccount").check()
# Click the "Save" button to save the configuration
page.get_by_role("button", name="Save").click(timeout=300000)
# Switch to the "Database" tab
page.get_by_role("tab", name="Database").click()
# Fill in the database related fields
page.get_by_role("textbox", name="Schema Name :").fill(ssm_parameter_values["db_name"])
page.get_by_role("textbox", name="Hostname :").fill(ssm_parameter_values["db_hostname"])
page.get_by_role("textbox", name="Port :").fill(ssm_parameter_values["db_port"])
page.get_by_role("textbox", name="Database Username :").fill(ssm_parameter_values["db_username"])
page.get_by_role("textbox", name="Database Password :").fill(ssm_parameter_values["db_password"])
page.get_by_role("textbox", name="Confirm Password :").fill(ssm_parameter_values["db_password"])
# Click the "Save" button to save the database configuration
page.get_by_role("button", name="Save").click()
# Wait 15 seconds
time.sleep(15)
print("Configuration is done, deploying service...")
# Click the "System Status" button
page.get_by_role("button", name="System Status").click()
# Click the "Deploy" button
with page.expect_popup() as page1_info:
page.get_by_role("button", name="Deploy", exact=True).click(timeout=300000)
page1 = page1_info.value
page1.goto("http://localhost:4321/flexnetsetup/managecomponents_FNO.action")
page.goto("http://localhost:4321/flexnetsetup/diagnostic.action")
# Click the "Close" button in the Deploy popup
page1.get_by_role("button", name="Close").click(timeout=300000)
print("Deployment is complete!")
# Take video of automation session (for debugging purposes)
context = browser.new_context(record_video_dir="C:\\tmp\\")
# Close the browser context and browser
context.close()
browser.close()
with sync_playwright() as playwright:
# Fetch the AWS region and tags of the EC2 instance
aws_region = ec2_metadata.region
tags = fetch_tags(ec2_metadata.instance_id, aws_region)
# Deploy FlexNet Operations using the tags provided by the EC2 instance metadata
deploy(playwright, tags['app_name'], tags['environment'], aws_region)
Editor is loading...
Leave a Comment