diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dda016a45..8f6584186 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -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 diff --git a/.github/workflows/integration_tests_pr.yml b/.github/workflows/integration_tests_pr.yml index 785a8f2be..9de78ed02 100644 --- a/.github/workflows/integration_tests_pr.yml +++ b/.github/workflows/integration_tests_pr.yml @@ -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 @@ -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 }} \ No newline at end of file diff --git a/.github/workflows/nightly-smoke-tests.yml b/.github/workflows/nightly-smoke-tests.yml deleted file mode 100644 index 5e4d1e062..000000000 --- a/.github/workflows/nightly-smoke-tests.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: Nightly Smoke Tests - -on: - schedule: - - cron: "0 0 * * *" - workflow_dispatch: - -jobs: - smoke_tests: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - ref: main - - - name: Checkout code - uses: actions/setup-go@v5 - with: - go-version: 'stable' - - - run: go version - - - name: Run smoke tests - run: make smoketest - env: - LINODE_TOKEN: ${{ secrets.DX_LINODE_TOKEN }} diff --git a/.github/workflows/nightly_smoke_tests.yml b/.github/workflows/nightly_smoke_tests.yml new file mode 100644 index 000000000..9c52abd0e --- /dev/null +++ b/.github/workflows/nightly_smoke_tests.yml @@ -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 }} \ No newline at end of file diff --git a/test/Makefile b/test/Makefile index 2c1832fdb..22e743cb1 100644 --- a/test/Makefile +++ b/test/Makefile @@ -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/... diff --git a/test/integration/account_events_test.go b/test/integration/account_events_test.go index c367853ff..7c305034d 100644 --- a/test/integration/account_events_test.go +++ b/test/integration/account_events_test.go @@ -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 { diff --git a/test/integration/databases_test.go b/test/integration/databases_test.go index 47b007e1f..06e1692e7 100644 --- a/test/integration/databases_test.go +++ b/test/integration/databases_test.go @@ -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) diff --git a/test/integration/firewall_rules_test.go b/test/integration/firewall_rules_test.go index ac8eca3ef..a597eed5e 100644 --- a/test/integration/firewall_rules_test.go +++ b/test/integration/firewall_rules_test.go @@ -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") diff --git a/test/integration/firewalls_devices_test.go b/test/integration/firewalls_devices_test.go index 693fa2cbf..93559cf7e 100644 --- a/test/integration/firewalls_devices_test.go +++ b/test/integration/firewalls_devices_test.go @@ -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) diff --git a/test/integration/instance_config_test.go b/test/integration/instance_config_test.go index 5af8d6c68..90af8b257 100644 --- a/test/integration/instance_config_test.go +++ b/test/integration/instance_config_test.go @@ -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", diff --git a/test/integration/instances_test.go b/test/integration/instances_test.go index c71b1542b..ac73f8a60 100644 --- a/test/integration/instances_test.go +++ b/test/integration/instances_test.go @@ -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, diff --git a/test/integration/lke_clusters_test.go b/test/integration/lke_clusters_test.go index efbbb30ab..c2a735de4 100644 --- a/test/integration/lke_clusters_test.go +++ b/test/integration/lke_clusters_test.go @@ -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") diff --git a/test/integration/longview_test.go b/test/integration/longview_test.go index 994a13f26..1a207d362 100644 --- a/test/integration/longview_test.go +++ b/test/integration/longview_test.go @@ -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() diff --git a/test/integration/network_ips_test.go b/test/integration/network_ips_test.go index b61b5c346..06deac8a0 100644 --- a/test/integration/network_ips_test.go +++ b/test/integration/network_ips_test.go @@ -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 { diff --git a/test/integration/nodebalancer_firewalls_test.go b/test/integration/nodebalancer_firewalls_test.go index c2ec159ce..c49d675e2 100644 --- a/test/integration/nodebalancer_firewalls_test.go +++ b/test/integration/nodebalancer_firewalls_test.go @@ -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 { diff --git a/test/integration/nodebalancers_test.go b/test/integration/nodebalancers_test.go index 1a786406e..cf0e1e30a 100644 --- a/test/integration/nodebalancers_test.go +++ b/test/integration/nodebalancers_test.go @@ -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() diff --git a/test/integration/object_storage_bucket_certs_test.go b/test/integration/object_storage_bucket_certs_test.go index 3cda473e5..bf2fec77e 100644 --- a/test/integration/object_storage_bucket_certs_test.go +++ b/test/integration/object_storage_bucket_certs_test.go @@ -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", diff --git a/test/integration/placement_group_test.go b/test/integration/placement_group_test.go index 98e133417..d55559761 100644 --- a/test/integration/placement_group_test.go +++ b/test/integration/placement_group_test.go @@ -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 diff --git a/test/integration/profile_test.go b/test/integration/profile_test.go index f1e6096d4..e2e96d1b9 100644 --- a/test/integration/profile_test.go +++ b/test/integration/profile_test.go @@ -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() diff --git a/test/integration/stackscripts_test.go b/test/integration/stackscripts_test.go index ef2aa5011..cce14700c 100644 --- a/test/integration/stackscripts_test.go +++ b/test/integration/stackscripts_test.go @@ -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() diff --git a/test/integration/tags_test.go b/test/integration/tags_test.go index a7a08d501..b2dc748a2 100644 --- a/test/integration/tags_test.go +++ b/test/integration/tags_test.go @@ -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 { diff --git a/test/integration/vlans_test.go b/test/integration/vlans_test.go index c8f146a13..64bcced77 100644 --- a/test/integration/vlans_test.go +++ b/test/integration/vlans_test.go @@ -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" diff --git a/test/integration/vpc_test.go b/test/integration/vpc_test.go index 7ae47872d..a5a19c15d 100644 --- a/test/integration/vpc_test.go +++ b/test/integration/vpc_test.go @@ -124,7 +124,7 @@ func vpcUpdateOptionsCheck( } } -func TestVPC_CreateGet(t *testing.T) { +func TestVPC_CreateGet_smoke(t *testing.T) { client, vpc, teardown, err := setupVPC(t, "fixtures/TestVPC_CreateGet") defer teardown() if err != nil {