Git Product home page Git Product logo

kubefirst-api's Introduction

Gitops Infrastructure & Application Delivery Platform

Install |  Twitter |  LinkedIn |  Slack |  Blog

kubefirst-api

Kubefirst API runtime implementation.

Running Locally

The API is available at http://localhost:8081/api/v1 while running.

Build the Binary

The API can be run locally for testing. It can be run by using make build and then calling the binary in the bin/ directory or by using go run ..

Leverage air for Live Reloading Locally

Prerequsite - Install air.

go install github.com/cosmtrek/air@latest

Run air from the root of the repository. This will watch go files and live rebuild a local running instance of kubefirst-api.

Prerequisites

The API uses MongoDB for storing records.

The best option is to use MongoDB Atlas. This is the recommended approach.

For local development, you can install MongoDB Community Edition - this is not production-quality.

It is also recommended to install MongoDB Compass.

The host:port for MongoDB should be supplied as the environment variable MONGODB_HOST. When testing locally, use localhost:27017.

Environment Variables

Some variables are required, others are optional depending on deployment type.

Variable Description Required
MONGODB_HOST_TYPE Can be either atlas or local. Yes
MONGODB_HOST The host to connect to. For Atlas, use only the portion of the string not containing username or password. For all other types, append the port. Yes
MONGODB_USERNAME Required when using Atlas. If using Atlas
MONGODB_PASSWORD Required when using Atlas. If using Atlas
IN_CLUSTER Specify whether or not the API is running inside a Kubernetes cluster. By default, this is assumed false. No
CLUSTER_ID The ID of the cluster running API. Yes
CLUSTER_TYPE Cluster type. Yes
INSTALL_METHOD Description of the method through which the API was deployed. Example: helm Yes
K1_ACCESS_TOKEN Access token in authorization header to prevent unsolicited in-cluster access Yes

To run locally:

# optional local mongodb for kubefirst-api
docker run -d --name k1-api-mongodb \
  -e MONGO_INITDB_ROOT_USERNAME=root \
  -e MONGO_INITDB_ROOT_PASSWORD=some-password \
  -p 27017:27017 \
  mongo

local environment variables

see this .env example for the necessary values

Provider Support

The following providers are available for use with the API.

Provider Status Supported Operations Supported Git Providers
AWS Beta Create, Delete GitHub, GitLab
Civo Beta Create, Delete GitHub, GitLab
Digital Ocean Beta Create, Delete GitHub, GitLab
Vultr Beta Create, Delete GitHub, GitLab

Creating a Cluster

In order to create a cluster, authentication credentials must be provided in one of two ways:

Kubernetes Secret

If a Kubernetes Secret called kubefirst-auth exists, the API will attempt to read cloud provider credentials from this Secret.

The Secret format is expected to have the following keys based on which clouds you are deploying to:

aws-access-key-id
aws-secret-access-key
aws-session-token

civo-token

do-token
do-spaces-key
do-spaces-token

vultr-api-key

Each key must have the appropriate value set in order for the API to successfully create a cluster.

API Call Parameters

If there is no Secret, the API will then attempt to read from the parameters passed in via the API call.

This would require the following parameters added to the API call depending on which cloud provider is being used:

{
	"aws_auth": {
		"access_key_id": "foo",
		"secret_access_key": "bar",
		"session_token": "baz"
	}
}
{
	"civo_auth": {
		"token": "my-civo-token"
	}
}
{
	"do_auth": {
		"token": "my-do-token",
		"spaces_key": "foo",
		"spaces_secret": "bar"
	}
}
{
	"do_auth": {
		"key_file": "my-google-credentials-json-keyfile-stringified-no-newline-characters",
		"project_id": "google cloud project id"
	}
}
{
	"vultr_auth": {
		"token": "my-vultr-api-key"
	}
}

If either of these options is missing, the API will return an error.

AWS

You must use the authentication strategy above to set credentials before running.

curl -X POST http://localhost:8081/api/v1/cluster/kf-api-scott-test -H "Content-Type: application/json" -d '{"admin_email": "[email protected]", "cloud_provider": "aws", "cloud_region": "us-east-1", "domain_name": "kubefirst.cloud", "git_owner": "kubefirst-cloud", "git_provider": "github", "git_token": "ghp_...", "type": "mgmt"}'

Civo

You must use the authentication strategy above to set credentials before running.

curl -X POST http://localhost:8081/api/v1/cluster/my-cool-cluster -H "Content-Type: application/json" -d '{"admin_email": "[email protected]", "cloud_provider": "civo", "cloud_region": "nyc1", "domain_name": "your-dns.io", "git_owner": "your-dns-io", "git_provider": "github", "git_token": "ghp_...", "type": "mgmt"}'

Digital Ocean

Kubefirst does not create a Digital Ocean space for you. You must create one ahead of time and provide the key and secret when creating a Digital Ocean cluster. The space acts as an S3-compatible storage bucket for Terraform state and other cluster operations.

You must use the authentication strategy above to set credentials before running.

curl -X POST http://localhost:8081/api/v1/cluster/my-cool-cluster -H "Content-Type: application/json" -d '{"admin_email": "[email protected]", "cloud_provider": "digitalocean", "cloud_region": "nyc3", "domain_name": "kubefunk.de", "git_owner": "kubefunk-de", "git_provider": "github", "git_token": "ghp_...", "type": "mgmt"}'

Vultr

You must use the authentication strategy above to set credentials before running.

curl -X POST http://localhost:8081/api/v1/cluster/my-cool-cluster -H "Content-Type: application/json" -d '{"admin_email": "[email protected]", "cloud_provider": "vultr", "cloud_region": "ewr", "domain_name": "kubesecond.com", "git_owner": "your-dns-io", "git_provider": "github", "git_token": "ghp_...", "type": "mgmt"}'

Deleting a Cluster

curl -X DELETE http://localhost:8081/api/v1/cluster/my-cool-cluster

Authentication

The API expects an Authorization header with the content Bearer <API key>. For example:

❯ curl -X GET "localhost:8081/api/v1/cluster" \
     -H "Authorization: Bearer my-api-key" \
     -H "Content-Type:application/json"

The provided bearer token is validated against an auto-generated key that gets stored in secret kubefirst-initial-secrets provided by this chart. It's then consumed by this same chart's deployment as an environment variable K1_ACCESS_TOKEN for the comparison. The console application will have access to this same namespaced secret and can leverage the bearer token to authorize calls to the kubefirst-api and kubefirst-api-ee services.

Swagger UI

When the app is running, the UI is available via http://localhost:8081/swagger/index.html.

Updating Swagger Docs

Swagger UI is generated using gin-swagger. Tagged routes will generate documentation.

Any time godoc defs for routes are changed, swag init should be run.

In order to generate docs:

go install github.com/swaggo/swag/cmd/swag@latest
make updateswagger

kubefirst-api's People

Contributors

echoboomer avatar claywd avatar johndietz avatar jarededwards avatar cristhianf7 avatar d-b-hawk avatar fharper avatar kube1st avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.