Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: Refactor smoke tests; improve CI and integration fork workflows #591

2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ jobs:
notify-slack:
runs-on: ubuntu-latest
needs: [test]
if: always() && github.ref == 'refs/heads/main' && github.event_name == 'push' # Run even if integration tests fail and only on main repository
if: ${{ (success() || failure()) && github.ref == 'refs/heads/main' && github.event_name == 'push' && github.repository == 'linode/linodego' }} # Run even if integration tests fail and only on main repository

steps:
- name: Notify Slack
Expand Down
73 changes: 58 additions & 15 deletions .github/workflows/integration_tests_pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,29 +36,15 @@ jobs:
with:
ref: ${{ inputs.sha }}

- name: Download kubectl and calicoctl for LKE clusters
run: |
curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
curl -LO "https://github.com/projectcalico/calico/releases/download/v3.25.0/calicoctl-linux-amd64"
chmod +x calicoctl-linux-amd64 kubectl
mv calicoctl-linux-amd64 /usr/local/bin/calicoctl
mv kubectl /usr/local/bin/kubectl

- run: make ARGS="-run ${{ inputs.module }}" fixtures
if: ${{ inputs.module != '' && steps.disallowed-char-check.outputs.match == '' }}
env:
LINODE_TOKEN: ${{ secrets.DX_LINODE_TOKEN }}

- run: make fixtures
if: ${{ inputs.module == '' }}
env:
LINODE_TOKEN: ${{ secrets.DX_LINODE_TOKEN }}

- name: Apply Calico Rules to LKE
if: always()
run: |
cd scripts && ./lke_calico_rules_e2e.sh
env:
LINODE_TOKEN: ${{ secrets.DX_LINODE_TOKEN }}

- name: Get the hash value of the latest commit from the PR branch
uses: octokit/graphql-action@v2.x
Expand Down Expand Up @@ -112,3 +98,60 @@ jobs:
conclusion: process.env.conclusion
});
return result;

apply-calico-rules:
runs-on: ubuntu-latest
needs: [integration-fork]
if: ${{ success() || failure() }}

steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: 'recursive'

- name: Download kubectl and calicoctl for LKE clusters
run: |
curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
curl -LO "https://github.com/projectcalico/calico/releases/download/v3.25.0/calicoctl-linux-amd64"
chmod +x calicoctl-linux-amd64 kubectl
mv calicoctl-linux-amd64 /usr/local/bin/calicoctl
mv kubectl /usr/local/bin/kubectl

- name: Apply Calico Rules to LKE
run: |
cd e2e_scripts/cloud_security_scripts/lke_calico_rules/ && ./lke_calico_rules_e2e.sh
env:
LINODE_TOKEN: ${{ secrets.DX_LINODE_TOKEN }}

add-fw-to-remaining-instances:
runs-on: ubuntu-latest
needs: [integration-fork]
if: ${{ success() || failure() }}

steps:
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.x'

- name: Install Linode CLI
run: |
pip install linode-cli

- name: Create Firewall and Attach to Instances
run: |
FIREWALL_ID=$(linode-cli firewalls create --label "e2e-fw-$(date +%s)" --rules.inbound_policy "DROP" --rules.outbound_policy "ACCEPT" --text --format=id --no-headers)
echo "Created Firewall with ID: $FIREWALL_ID"

for instance_id in $(linode-cli linodes list --format "id" --text --no-header); do
echo "Attaching firewall to instance: $instance_id"
if linode-cli firewalls device-create "$FIREWALL_ID" --id "$instance_id" --type linode; then
echo "Firewall attached to instance $instance_id successfully."
else
echo "An error occurred while attaching firewall to instance $instance_id. Skipping..."
fi
done
env:
LINODE_CLI_TOKEN: ${{ secrets.DX_LINODE_TOKEN }}
28 changes: 0 additions & 28 deletions .github/workflows/nightly-smoke-tests.yml

This file was deleted.

98 changes: 98 additions & 0 deletions .github/workflows/nightly_smoke_tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
name: Nightly Smoke Tests

on:
schedule:
- cron: "0 0 * * *"
workflow_dispatch:
inputs:
sha:
description: 'Commit SHA to test'
required: false
default: ''
type: string

jobs:
smoke_tests:
if: github.repository == 'linode/linodego' || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: 'recursive'
ref: ${{ github.event.inputs.sha || github.ref }}

- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: '1.x'

- name: Run smoke tests
id: smoke_tests
run: |
make smoketest
env:
LINODE_TOKEN: ${{ secrets.DX_LINODE_TOKEN }}

- name: Notify Slack
if: (success() || failure()) && github.repository == 'linode/linodego'
uses: slackapi/slack-github-action@v1.27.0
with:
channel-id: ${{ secrets.SLACK_CHANNEL_ID }}
payload: |
{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": ":rocket: *${{ github.workflow }} Completed in: ${{ github.repository }}* :white_check_mark:"
}
},
{
"type": "divider"
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*Build Result:*\n${{ steps.smoke_tests.outcome == 'success' && ':large_green_circle: Build Passed' || ':red_circle: Build Failed' }}"
},
{
"type": "mrkdwn",
"text": "*Branch:*\n`${{ github.ref_name }}`"
}
]
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*Commit Hash:*\n<${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }}|${{ github.sha }}>"
},
{
"type": "mrkdwn",
"text": "*Run URL:*\n<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|View Run Details>"
}
]
},
{
"type": "divider"
},
{
"type": "context",
"elements": [
{
"type": "mrkdwn",
"text": "Triggered by: :bust_in_silhouette: `${{ github.actor }}`"
}
]
}
]
}
env:
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
5 changes: 3 additions & 2 deletions test/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,10 @@ testunit:
.PHONY: smoketest

smoketest:
@LINODE_FIXTURE_MODE="play" \
LINODE_TOKEN="awesometokenawesometokenawesometoken" \
@LINODE_FIXTURE_MODE="record" \
LINODE_TOKEN=$(LINODE_TOKEN) \
LINODE_API_VERSION="v4beta" \
LINODE_URL="$(LINODE_URL)" \
GO111MODULE="on" \
go test -v -run smoke ./integration/...

Expand Down
2 changes: 1 addition & 1 deletion test/integration/account_events_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (
"github.com/linode/linodego"
)

func TestAccountEvents_List(t *testing.T) {
func TestAccountEvents_List_smoke(t *testing.T) {
client, instance, teardown, err := setupInstance(t, "fixtures/TestAccountEvents_List", true)
defer teardown()
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion test/integration/databases_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ func TestDatabase_Type(t *testing.T) {
}
}

func TestDatabase_List_smoke(t *testing.T) {
func TestDatabase_List(t *testing.T) {
client, database, teardown, err := setupPostgresDatabase(t, nil, "fixtures/TestDatabase_List")
if err != nil {
t.Error(err)
Expand Down
2 changes: 1 addition & 1 deletion test/integration/firewall_rules_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ var (
}
)

func TestFirewallRules_Get(t *testing.T) {
func TestFirewallRules_Get_smoke(t *testing.T) {
client, firewall, teardown, err := setupFirewall(t, []firewallModifier{func(createOpts *linodego.FirewallCreateOptions) {
createOpts.Rules = testFirewallRuleSet
}}, "fixtures/TestFirewallRules_Get")
Expand Down
2 changes: 1 addition & 1 deletion test/integration/firewalls_devices_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
"github.com/linode/linodego"
)

func TestFirewallDevices_List(t *testing.T) {
func TestFirewallDevices_List_smoke(t *testing.T) {
client, instance, teardown, err := setupInstance(t, "fixtures/TestFirewallDevices_List", false)
if err != nil {
t.Error(err)
Expand Down
2 changes: 1 addition & 1 deletion test/integration/instance_config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ func TestInstance_ConfigInterfaces_Reorder(t *testing.T) {
}
}

func TestInstance_ConfigInterfaces_List(t *testing.T) {
func TestInstance_ConfigInterfaces_List_smoke(t *testing.T) {
client, _, _, instance, config, teardown := setupInstanceWith3Interfaces(
t,
"fixtures/TestInstance_ConfigInterfaces_List",
Expand Down
2 changes: 1 addition & 1 deletion test/integration/instances_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import (

type instanceModifier func(*linodego.Client, *linodego.InstanceCreateOptions)

func TestInstances_List(t *testing.T) {
func TestInstances_List_smoke(t *testing.T) {
client, instance, _, teardown, err := setupInstanceWithoutDisks(
t,
"fixtures/TestInstances_List", true,
Expand Down
2 changes: 1 addition & 1 deletion test/integration/lke_clusters_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ func TestLKECluster_WaitForReady(t *testing.T) {
}
}

func TestLKECluster_GetFound(t *testing.T) {
func TestLKECluster_GetFound_smoke(t *testing.T) {
client, lkeCluster, teardown, err := setupLKECluster(t, []clusterModifier{func(createOpts *linodego.LKEClusterCreateOptions) {
createOpts.Label = "go-lke-test-found"
}}, "fixtures/TestLKECluster_GetFound")
Expand Down
2 changes: 1 addition & 1 deletion test/integration/longview_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (
"github.com/linode/linodego"
)

func TestLongviewClient_Get(t *testing.T) {
func TestLongviewClient_Get_smoke(t *testing.T) {
client, teardown := createTestClient(t, "fixtures/TestLongviewClient_Get")
defer teardown()

Expand Down
2 changes: 1 addition & 1 deletion test/integration/network_ips_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ func TestIPAddress_GetMissing(t *testing.T) {
}
}

func TestIPAddress_GetFound(t *testing.T) {
func TestIPAddress_GetFound_smoke(t *testing.T) {
client, instance, _, teardown, err := setupInstanceWithoutDisks(t, "fixtures/TestIPAddress_GetFound", true)
defer teardown()
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion test/integration/nodebalancer_firewalls_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import (
"testing"
)

func TestNodeBalancerFirewalls_List(t *testing.T) {
func TestNodeBalancerFirewalls_List_smoke(t *testing.T) {
client, nodebalancer, teardown, err := setupNodeBalancer(t,
"fixtures/TestNodeBalancerFirewalls_List")
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion test/integration/nodebalancers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ var (
label = "go-test-def"
)

func TestNodeBalancer_Create_create(t *testing.T) {
func TestNodeBalancer_Create_create_smoke(t *testing.T) {
_, nodebalancer, teardown, err := setupNodeBalancer(t, "fixtures/TestNodeBalancer_Create")
defer teardown()

Expand Down
2 changes: 1 addition & 1 deletion test/integration/object_storage_bucket_certs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ HMuBpZsWkNKLh0hjC5i7YBZYtXGYPG2JCEE4mpiV8ClxTvmijsr8sYUOtnmIBXfG
`
)

func TestObjectStorageBucketCert(t *testing.T) {
func TestObjectStorageBucketCert_smoke(t *testing.T) {
client, fixtureTeardown := createTestClient(t, "fixtures/TestObjectStorageBucketCert")
bucket, err := client.CreateObjectStorageBucket(context.Background(), linodego.ObjectStorageBucketCreateOptions{
Cluster: "us-east-1",
Expand Down
2 changes: 1 addition & 1 deletion test/integration/placement_group_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import (

type placementGroupModifier func(*linodego.Client, *linodego.PlacementGroupCreateOptions)

func TestPlacementGroup_basic(t *testing.T) {
func TestPlacementGroup_basic_smoke(t *testing.T) {
client, clientTeardown := createTestClient(t, "fixtures/TestPlacementGroup_basic")

// Create a PG
Expand Down
2 changes: 1 addition & 1 deletion test/integration/profile_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import (
"testing"
)

func TestProfile_Get(t *testing.T) {
func TestProfile_Get_smoke(t *testing.T) {
client, teardown := createTestClient(t, "fixtures/TestProfile_Get")
defer teardown()

Expand Down
2 changes: 1 addition & 1 deletion test/integration/stackscripts_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (
"github.com/linode/linodego"
)

func TestStackscripts_List(t *testing.T) {
func TestStackscripts_List_smoke(t *testing.T) {
client, teardown := createTestClient(t, "fixtures/TestStackscripts_List")
defer teardown()

Expand Down
2 changes: 1 addition & 1 deletion test/integration/tags_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (
. "github.com/linode/linodego"
)

func TestTag_Create_create(t *testing.T) {
func TestTag_Create_create_smoke(t *testing.T) {
client, instance, teardown, err := setupTaggedInstance(t, "fixtures/TestTag_Create")
defer teardown()
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion test/integration/vlans_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
"github.com/linode/linodego"
)

func TestVLANs_List(t *testing.T) {
func TestVLANs_List_smoke(t *testing.T) {
vlanName := "go-vlan-test-list"
instancePrefix := "go-ins-test-list"

Expand Down
Loading