Nobl9 SDK for Go
Reading time: 0 minute(s) (0 words)
The Nobl9 SDK for Go is a library which provides primitives for defining, validating, and managing Nobl9 resources. It is the backbone of sloctl, our awesome CLI and many other projects. It gives you full control and customization over programmatic integration with Nobl9 platform.
Example
First, let's setup a Go project, run:
# Creates a new Go module.
go mod init nobl9-go-example
# Adds nobl9-go as a dependency to your module.
go get github.com/nobl9/nobl9-go
# Create an entrypoint for your application.
touch main.go
Copy one of the following examples to main.go.
The default client reads credentials and platform settings
from environment variables or the sloctl config.toml file.
If you don't have config.toml configuration file, you can provide
user access key or an
API key directly (see Custom credentials variant).
- Default client
- Custom credentials
main.go
package main
import (
"context"
"encoding/json"
"fmt"
"log"
"github.com/nobl9/nobl9-go/manifest"
"github.com/nobl9/nobl9-go/manifest/v1alpha"
"github.com/nobl9/nobl9-go/manifest/v1alpha/project"
"github.com/nobl9/nobl9-go/manifest/v1alpha/service"
"github.com/nobl9/nobl9-go/sdk"
objectsV1 "github.com/nobl9/nobl9-go/sdk/endpoints/objects/v1"
objectsV2 "github.com/nobl9/nobl9-go/sdk/endpoints/objects/v2"
)
func main() {
ctx := context.Background()
client, err := sdk.DefaultClient()
if err != nil {
log.Fatalf("failed to create sdk client, err: %v", err)
}
// Read from a file, URL, or glob pattern.
objects, err := sdk.ReadObjects(ctx, "./project.yaml")
if err != nil {
log.Fatalf("failed to read project.yaml file, err: %v", err)
}
// Use manifest.FilterByKind to extract specific objects from the manifest.Object slice.
myProject := manifest.FilterByKind[project.Project](objects)[0]
// Define objects in code.
myService := service.New(
service.Metadata{
Name: "my-service",
DisplayName: "My Service",
Project: myProject.GetName(),
Labels: v1alpha.Labels{
"team": []string{"green", "orange"},
"region": []string{"eu-central-1"},
},
},
service.Spec{
Description: "Example service",
},
)
objects = append(objects, myService)
// Verify the objects.
if errs := manifest.Validate(objects); len(errs) > 0 {
log.Fatalf("service validation failed, errors: %v", errs)
}
// Apply the objects.
if err = client.Objects().V2().Apply(ctx, objectsV2.ApplyRequest{Objects: objects}); err != nil {
log.Fatalf("failed to apply objects, err: %v", err)
}
// Get the applied resources.
services, err := client.Objects().V1().GetV1alphaServices(ctx, objectsV1.GetServicesRequest{
Project: myProject.GetName(),
Names: []string{myService.GetName()},
})
if err != nil {
log.Fatalf("failed to get services, err: %v", err)
}
projects, err := client.Objects().V1().GetV1alphaProjects(ctx, objectsV1.GetProjectsRequest{
Names: []string{myProject.GetName()},
})
if err != nil {
log.Fatalf("failed to get projects, err: %v", err)
}
// Aggregate objects back into manifest.Objects slice.
appliedObjects := make([]manifest.Object, 0, len(services)+len(projects))
for _, service := range services {
appliedObjects = append(appliedObjects, service)
}
for _, project := range projects {
appliedObjects = append(appliedObjects, project)
}
// Print JSON representation of these objects.
data, err := json.MarshalIndent(appliedObjects, "", " ")
if err != nil {
log.Fatalf("failed to marshal objects, err: %v", err)
}
fmt.Println(string(data))
// Delete resources.
if err = client.Objects().V2().Delete(ctx, objectsV2.DeleteRequest{Objects: objects}); err != nil {
log.Fatalf("failed to delete objects, err: %v", err)
}
}
Choose your Nobl9 instance
main.go
package main
import (
"context"
"encoding/json"
"fmt"
"log"
"github.com/nobl9/nobl9-go/manifest"
"github.com/nobl9/nobl9-go/manifest/v1alpha"
"github.com/nobl9/nobl9-go/manifest/v1alpha/project"
"github.com/nobl9/nobl9-go/manifest/v1alpha/service"
"github.com/nobl9/nobl9-go/sdk"
objectsV1 "github.com/nobl9/nobl9-go/sdk/endpoints/objects/v1"
objectsV2 "github.com/nobl9/nobl9-go/sdk/endpoints/objects/v2"
)
func main() {
ctx := context.Background()
config, err := sdk.ReadConfig(
sdk.ConfigOptionWithCredentials("<CLIENT_ID>", "<CLIENT_SECRET>"),
sdk.ConfigOptionNoConfigFile(),
)
if err != nil {
log.Fatalf("failed to read sdk config, err: %v", err)
}
client, err := sdk.NewClient(config)
if err != nil {
log.Fatalf("failed to create sdk client, err: %v", err)
}
// Read from a file, URL, or glob pattern.
objects, err := sdk.ReadObjects(ctx, "./project.yaml")
if err != nil {
log.Fatalf("failed to read project.yaml file, err: %v", err)
}
// Use manifest.FilterByKind to extract specific objects from the manifest.Object slice.
myProject := manifest.FilterByKind[project.Project](objects)[0]
// Define objects in code.
myService := service.New(
service.Metadata{
Name: "my-service",
DisplayName: "My Service",
Project: myProject.GetName(),
Labels: v1alpha.Labels{
"team": []string{"green", "orange"},
"region": []string{"eu-central-1"},
},
},
service.Spec{
Description: "Example service",
},
)
objects = append(objects, myService)
// Verify the objects.
if errs := manifest.Validate(objects); len(errs) > 0 {
log.Fatalf("service validation failed, errors: %v", errs)
}
// Apply the objects.
if err = client.Objects().V2().Apply(ctx, objectsV2.ApplyRequest{Objects: objects}); err != nil {
log.Fatalf("failed to apply objects, err: %v", err)
}
// Get the applied resources.
services, err := client.Objects().V1().GetV1alphaServices(ctx, objectsV1.GetServicesRequest{
Project: myProject.GetName(),
Names: []string{myService.GetName()},
})
if err != nil {
log.Fatalf("failed to get services, err: %v", err)
}
projects, err := client.Objects().V1().GetV1alphaProjects(ctx, objectsV1.GetProjectsRequest{
Names: []string{myProject.GetName()},
})
if err != nil {
log.Fatalf("failed to get projects, err: %v", err)
}
// Aggregate objects back into manifest.Objects slice.
appliedObjects := make([]manifest.Object, 0, len(services)+len(projects))
for _, service := range services {
appliedObjects = append(appliedObjects, service)
}
for _, project := range projects {
appliedObjects = append(appliedObjects, project)
}
// Print JSON representation of these objects.
data, err := json.MarshalIndent(appliedObjects, "", " ")
if err != nil {
log.Fatalf("failed to marshal objects, err: %v", err)
}
fmt.Println(string(data))
// Delete resources.
if err = client.Objects().V2().Delete(ctx, objectsV2.DeleteRequest{Objects: objects}); err != nil {
log.Fatalf("failed to delete objects, err: %v", err)
}
}
Finally, run the selected example:
go mod tidy
go run main.go
Useful links
Check out these related guides and references: