Files
org-notes/lbaas-testing.org
2023-09-26 10:27:22 -04:00

4.5 KiB

LBaaS Testing

API Testing

  PS1="> "
  export PAPI_KEY="my-user-api-key"
  export PROJECT_ID=7c0d4b1d-4f21-4657-96d4-afe6236e361e

First let's exchange our user's API key for an infratographer JWT.

  export INFRA_TOK=$(curl -s -X POST -H"authorization: Bearer $PAPI_KEY" https://iam.metalctrl.io/api-keys/exchange |  jq -M -r '.access_token' )

If all went well, you should see a json object containing the loadbalancers key from this block.

curl -s -H"Authorization: Bearer $INFRA_TOK" https://lb.metalctrl.io/v1/projects/${PROJECT_ID}/loadbalancers | jq -M
{
  "loadbalancers": [
    {
      "created_at": "2023-08-30T18:26:19.534351Z",
      "id": "loadbal-9OhCaBNHUXo_f-gC7YKzW",
      "ips": [],
      "name": "test-graphql",
      "ports": [
        {
          "id": "loadprt-8fN2XRnwY8C0SGs_T-zhp",
          "name": "public-http",
          "number": 8080
        }
      ],
      "updated_at": "2023-08-30T18:26:19.534351Z"
    },
    {
      "created_at": "2023-08-30T19:55:42.944273Z",
      "id": "loadbal-pLdVJLcAa3UdbPEmGWwvB",
      "ips": [],
      "name": "test-graphql",
      "ports": [
        {
          "id": "loadprt-N8xRozMbxZwtG2yAPk7Wx",
          "name": "public-http",
          "number": 8080
        }
      ],
      "updated_at": "2023-08-30T19:55:42.944273Z"
    }
  ]
}

Creating a LB

Here we'll create an empty LB with our newly exchanged API key.

  curl -s \
       -H"Authorization: Bearer $INFRA_TOK" \
       -H"content-type: application/json" \
       -d '{"name": "test-graphql", "location_id": "metlloc-da", "provider_id":"loadpvd-gOB_-byp5ebFo7A3LHv2B"}' \
       https://lb.metalctrl.io/v1/projects/${PROJECT_ID}/loadbalancers | jq -M

> > > {
  "errors": null,
  "id": "loadbal-ygZi9cUywLk5_oAoLGMxh"
}

All we have is an ID now, but eventually we should get an IP back.

  RES=$(curl -s \
       -H"Authorization: Bearer $INFRA_TOK" \
       https://lb.metalctrl.io/v1/projects/${PROJECT_ID}/loadbalancers | tee )
  export LOADBALANCER_ID=$(echo $RES  | jq -r '.loadbalancers | sort_by(.created_at) | reverse | .[0].id' )
  echo $LOADBALANCER_ID

> > > loadbal-ygZi9cUywLk5_oAoLGMxh

Create the backends

The load balancer requires a pool with an associated origin.

  export POOL_ID=$(curl -s -H"Authorization: Bearer $INFRA_TOK" \
			-H"content-type: application/json" \
			-d '{"name": "pool9", "protocol": "tcp"}' \
			https://lb.metalctrl.io/v1/projects/${PROJECT_ID}/loadbalancers/pools |  jq -r '.id')
  echo $POOL_ID

> > > loadpol-hC_UY3Woqjfyfw1Tzr5R2

Let's create a LB that points to icanhazip.com so we can see how we're proxying

  export TARGET_IP=$(dig +short icanhazip.com | head -1)
  data=$(jq -M -c -n --arg port_id $POOL_ID --arg target_ip "$TARGET_IP" '{"name": "icanhazip9", "target": $target_ip, "port_id": $port_id, "port_number": 80, "active": true}' | tee )
  curl -s \
       -H"Authorization: Bearer $INFRA_TOK" \
       -H"content-type: application/json" \
       -d "$data" \
       https://lb.metalctrl.io/v1/loadbalancers/pools/${POOL_ID}/origins | jq -M

> > > > > {
  "errors": null,
  "id": "loadogn-zfbMfqtFKeQ75Tul52h4Q"
}
  curl -s \
       -H"Authorization: Bearer $INFRA_TOK" \
       -H"content-type: application/json" \
       -d "$(jq -n -M -c -n --arg pool_id $POOL_ID '{"name": "public-http", "number": 8080, "pool_ids": [$pool_id]}')" \
       https://lb.metalctrl.io/v1/loadbalancers/${LOADBALANCER_ID}/ports | jq -M

> > > {
  "errors": null,
  "id": "loadprt-IVrZB1sLUfKqdnDULd6Ix"
}

Let's try out the LB now

  curl -s \
       -H"Authorization: Bearer $INFRA_TOK" \
       -H"content-type: application/json" \
       https://lb.metalctrl.io/v1/loadbalancers/${LOADBALANCER_ID} | jq -M
> > {
  "created_at": "2023-08-30T20:10:59.389392Z",
  "id": "loadbal-ygZi9cUywLk5_oAoLGMxh",
  "ips": [],
  "name": "test-graphql",
  "ports": [
    {
      "id": "loadprt-IVrZB1sLUfKqdnDULd6Ix",
      "name": "public-http",
      "number": 8080
    }
  ],
  "provider": null,
  "updated_at": "2023-08-30T20:10:59.389392Z"
}