Skip to content

Create Instance

Create Instance #802

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: ✅