Create Instance #802
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Create Instance | |
on: | |
issue_comment: | |
types: [created] | |
jobs: | |
create: | |
runs-on: self-hosted | |
if: | |
${{ !github.event.issue.pull_request && ( | |
contains(github.event.comment.body, '/create') ) }} | |
steps: | |
- name: create command | |
id: create_command | |
uses: github/[email protected] | |
with: | |
command: "/create" | |
reaction: "rocket" | |
allowed_contexts: "issue" | |
permissions: "write,maintain,admin" | |
allowlist: "${{ vars.MORPHOCLOUD_GITHUB_ADMINS }}" | |
- uses: actions/checkout@v4 | |
- name: Add "request:approved" label | |
uses: actions/github-script@v7 | |
with: | |
script: | | |
github.rest.issues.addLabels({ | |
issue_number: context.payload.issue.number, | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
labels: ["request:approved"] | |
}) | |
- name: comment (progress) | |
id: couc_progress | |
uses: ./.github/actions/comment-progress | |
with: | |
create_ip: ⏳ | |
create_volume: "" | |
create_instance: "" | |
associate_ip: "" | |
setup_instance: "" | |
attach_volume: "" | |
send_email: "" | |
- name: Extract labels | |
id: labels | |
run: | | |
# If there are multiple "flavor:" labels, select the first one | |
instance_flavor=$( | |
gh issue view $ISSUE_NUMBER \ | |
--json labels \ | |
--jq '[.labels[].name | select(. | startswith("flavor:")) | split(":")[1]][0]' | |
) | |
echo "instance_flavor=$instance_flavor" >> $GITHUB_OUTPUT | |
env: | |
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
GH_REPO: ${{ github.repository }} | |
ISSUE_NUMBER: ${{ github.event.issue.number }} | |
- name: Define instance name | |
id: define | |
uses: ./.github/actions/define-instance-name | |
with: | |
prefix: ${{ vars.INSTANCE_NAME_PREFIX }} | |
issue_number: ${{ github.event.issue.number }} | |
- name: comment (progress) | |
uses: ./.github/actions/comment-progress | |
with: | |
comment-id: ${{ steps.couc_progress.outputs.comment-id }} | |
create_ip: ✅ | |
create_volume: ⏳ | |
create_instance: "" | |
associate_ip: "" | |
setup_instance: "" | |
attach_volume: "" | |
send_email: "" | |
- name: Define volume name | |
id: define_volume_name | |
uses: ./.github/actions/define-volume-name | |
with: | |
issue_number: ${{ github.event.issue.number }} | |
suffix: ${{ vars.VOLUME_NAME_SUFFIX }} | |
- name: Check volume exists | |
id: check_volume | |
uses: ./.github/actions/check-volume-exists | |
with: | |
os_cloud: ${{ vars.MORPHOCLOUD_OS_CLOUD }} | |
volume_name: ${{ steps.define_volume_name.outputs.volume_name }} | |
- name: comment (volume already exists) | |
if: ${{ fromJSON(steps.check_volume.outputs.exists) }} | |
uses: peter-evans/[email protected] | |
with: | |
issue-number: ${{ github.event.issue.number }} | |
body: | | |
### Instance Creation Results ⚠️ | |
Volume **${{ steps.define_volume_name.outputs.volume_name }}** already exists. | |
- name: Create Volume | |
if: ${{ ! fromJSON(steps.check_volume.outputs.exists) }} | |
id: create_volume | |
run: | | |
source ~/venv/bin/activate | |
openstack volume create --size 100 "${VOLUME_NAME}" | |
env: | |
OS_CLOUD: ${{ vars.MORPHOCLOUD_OS_CLOUD }} | |
VOLUME_NAME: ${{ steps.define_volume_name.outputs.volume_name }} | |
- name: comment (failed to create volume) | |
if: ${{ steps.create_volume.outcome == 'failure' && failure() }} | |
uses: peter-evans/[email protected] | |
with: | |
issue-number: ${{ github.event.issue.number }} | |
body: | | |
### Instance Creation Results ❌ | |
Failed to create volume. | |
See details at https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} | |
- name: comment (progress) | |
uses: ./.github/actions/comment-progress | |
with: | |
comment-id: ${{ steps.couc_progress.outputs.comment-id }} | |
create_ip: ✅ | |
create_volume: ✅ | |
create_instance: ⏳ | |
associate_ip: "" | |
setup_instance: "" | |
attach_volume: "" | |
send_email: "" | |
- name: Retrieve metadata | |
id: instance_metadata | |
uses: ./.github/actions/retrieve-metadata | |
with: | |
os_cloud: ${{ vars.MORPHOCLOUD_OS_CLOUD }} | |
instance_name: ${{ steps.define.outputs.instance_name }} | |
- name: Reboot instance | |
id: reboot_instance | |
run: | | |
ssh \ | |
-o StrictHostKeyChecking=no \ | |
-o UserKnownHostsFile=/dev/null \ | |
-o LogLevel=ERROR \ | |
exouser@$INSTANCE_IP \ | |
'sudo shutdown -r now' | |
sleep 5 | |
function check_instance_ready { | |
ssh \ | |
-o StrictHostKeyChecking=no \ | |
-o UserKnownHostsFile=/dev/null \ | |
-o LogLevel=ERROR \ | |
exouser@$INSTANCE_IP \ | |
'true' | |
} | |
set +e | |
max_attempts=3 | |
instance_ready=false | |
for attempt in $(seq 1 $max_attempts); do | |
echo "Checking if instance is ready ($attempt/$max_attempts)" | |
if check_instance_ready; then | |
instance_ready=true | |
echo "Instance '$INSTANCE_NAME' is ready." | |
break | |
else | |
echo "Instance '$INSTANCE_NAME' is not ready. Retrying in 5 seconds..." | |
sleep 5 | |
fi | |
done | |
if ! $instance_ready; then | |
echo "::error ::Instance '$INSTANCE_NAME' is not ready after $max_attempts attempts to connect." | |
exit 1 | |
fi | |
set -e | |
env: | |
INSTANCE_IP: ${{ steps.instance_metadata.outputs.instance_ip }} | |
INSTANCE_NAME: ${{ steps.define.outputs.instance_name }} | |
- name: comment (failed to install Slicer extension dependencies) | |
if: | |
${{ steps.slicer_install_extension_dependencies.outcome == 'failure' | |
&& failure() }} | |
uses: peter-evans/[email protected] | |
with: | |
issue-number: ${{ github.event.issue.number }} | |
body: | | |
### Instance Creation Results ❌ | |
Failed to install Slicer extension dependencies on instance **${{ steps.define.outputs.instance_name }}**. | |
See details at https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} | |
- name: Update Request Status Label | |
id: update-request-status-label | |
uses: ./.github/actions/update-request-status-label | |
with: | |
os_cloud: ${{ vars.MORPHOCLOUD_OS_CLOUD }} | |
token: ${{ secrets.GITHUB_TOKEN }} | |
instance_name: ${{ steps.define.outputs.instance_name }} | |
issue_number: ${{ github.event.issue.number }} | |
- name: comment (failed to update request status label) | |
if: | |
${{ steps.update-request-status-label.outcome == 'failure' && | |
failure() }} | |
uses: peter-evans/[email protected] | |
with: | |
issue-number: ${{ github.event.issue.number }} | |
body: | | |
### Instance Creation Results ❌ | |
Failed to update request status label for instance **${{ steps.define.outputs.instance_name }}**. | |
See details at https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} | |
- name: comment (progress) | |
uses: ./.github/actions/comment-progress | |
with: | |
comment-id: ${{ steps.couc_progress.outputs.comment-id }} | |
create_ip: ✅ | |
create_volume: ✅ | |
create_instance: ✅ | |
associate_ip: ✅ | |
setup_instance: ✅ | |
attach_volume: ✅ | |
send_email: ⏳ | |
- name: Send mail | |
id: send_email | |
if: ${{ steps.instance_poll.outputs.status == 'complete' }} | |
uses: ./.github/actions/send-email | |
with: | |
os_cloud: ${{ vars.MORPHOCLOUD_OS_CLOUD }} | |
token: ${{ secrets.GITHUB_TOKEN }} | |
string_encryption_key: ${{ secrets.STRING_ENCRYPTION_KEY }} | |
mail_server_username: ${{secrets.MAIL_USERNAME}} | |
mail_server_password: ${{secrets.MAIL_PASSWORD}} | |
instance_name: ${{ steps.define.outputs.instance_name }} | |
instance_issue_number: ${{ github.event.issue.number }} | |
- name: comment (failed to send email) | |
if: ${{ steps.send_email.outcome == 'failure' && failure() }} | |
uses: peter-evans/[email protected] | |
with: | |
issue-number: ${{ github.event.issue.number }} | |
body: | | |
### Instance Creation Results ❌ | |
Failed to send connection email for instance **${{ steps.define.outputs.instance_name }}**. ${{ steps.send_email.outputs.error_message }} | |
See details at https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} | |
- name: comment (progress) | |
uses: ./.github/actions/comment-progress | |
with: | |
comment-id: ${{ steps.couc_progress.outputs.comment-id }} | |
create_ip: ✅ | |
create_volume: ✅ | |
create_instance: ✅ | |
associate_ip: ✅ | |
setup_instance: ✅ | |
attach_volume: ✅ | |
send_email: ✅ |