Skip to content

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
BenjaminBoehm committed Oct 28, 2024
0 parents commit f055e72
Show file tree
Hide file tree
Showing 8 changed files with 282 additions and 0 deletions.
28 changes: 28 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# This workflow will build a golang project
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-go

name: Main

on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]

jobs:

build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up Go
uses: actions/setup-go@v4
with:
go-version: '1.23'

- name: Build
run: go build -v ./...

- name: Test
run: go test -v ./...
23 changes: 23 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: release

on:
release:
types: [created]

permissions:
contents: write
packages: write

jobs:
release-linux-amd64:
name: release linux/amd64
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: wangyoucao577/go-release-action@v1
with:
github_token: ${{ secrets.ACTIONS_KEY }}
goos: linux
goarch: amd64
compress_assets: FALSE
overwrite: TRUE
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.vscode/
10 changes: 10 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
.PHONY: lint vet

build:
go build -o check_ecs_snapshots main.go
lint:
go fmt $(go list ./... | grep -v /vendor/)
vet:
go vet $(go list ./... | grep -v /vendor/)
test:
go test -v -cover ./...
48 changes: 48 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Description
Check for Elastic Cloud Server (ECS) snapshot age on Open Telekom Cloud (OTC)

# Environment

* Option 1: clouds.yaml
* create config file (~/.config/openstack/clouds.yaml or /etc/openstack/clouds.yaml)
```yaml
---
clouds:
myCloud:
auth:
username: '<USERNAME>'
password: '<PASSWORD>'
project_name: 'eu-de'
user_domain_name: '<DOMAIN_NAME>'
auth_url: 'https://iam.eu-de.otc.t-systems.com/v3'
interface: 'public'
identity_api_version: 3 # !Important
```
* set env which cloud credentials should be used
```bash
export OS_CLOUD=myCloud
```

* Option 2: Environment Variables
```bash
export OS_PROJECT_NANME=eu-de
export OS_AUTH_URL="https://iam.eu-de.otc.t-systems.com:443/v3"
export OS_USER_DOMAIN_NAME="<DOMAIN_NAME>"
export OS_USERNAME="<USERNAME>"
export OS_PASSWORD="<PASSWORD>"
```

# Run
```bash
go run cmd/main.go
```

# Build
```bash
make build
```

# Dependencies

* OTC Cloud SDK: https://github.com/opentelekomcloud/gophertelekomcloud/
* Netways monitoring plugins library: https://github.com/NETWAYS/go-check
13 changes: 13 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
module github.com/BenjaminBoehm/check-ecs-snapshots

go 1.23.2

require (
github.com/NETWAYS/go-check v0.6.2
github.com/opentelekomcloud/gophertelekomcloud v0.9.3
)

require (
github.com/spf13/pflag v1.0.5 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
)
27 changes: 27 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
github.com/NETWAYS/go-check v0.6.2 h1:H/9Q/+rVzLbSUV/6QS9eDhyMUml7sf67TF4nSuHBwJo=
github.com/NETWAYS/go-check v0.6.2/go.mod h1:qx8m3s2Xul9wqfUjrCSArEFkOdtwxIyUmBYYrCkqA/8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/opentelekomcloud/gophertelekomcloud v0.9.3 h1:zdttgRAWc4uHgJ3PX5hP8ulhT1VYBh2JeRsItNPp8dg=
github.com/opentelekomcloud/gophertelekomcloud v0.9.3/go.mod h1:M1F6OfSRZRzAmAFKQqSLClX952at5hx5rHe4UTEykgg=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
132 changes: 132 additions & 0 deletions main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
package main

import (
"log"
"time"

check "github.com/NETWAYS/go-check"
golangsdk "github.com/opentelekomcloud/gophertelekomcloud"
"github.com/opentelekomcloud/gophertelekomcloud/openstack"
"github.com/opentelekomcloud/gophertelekomcloud/openstack/cbr/v3/backups"
"github.com/opentelekomcloud/gophertelekomcloud/openstack/evs/v2/snapshots"
)

func main() {
config := check.NewConfig()
config.Name = "check-ecs-snapshots"
config.Readme = `Check for Elastic Cloud Server (ECS) snapshot age on Open Telekom Cloud (OTC)`
config.Version = "1.0.0"

critical := config.FlagSet.IntP("critical", "c", 60, "critical threshold for age of snapshot in days")
warning := config.FlagSet.IntP("warning", "w", 30, "warning threshold for age of snapshot in days")
cbr := config.FlagSet.Bool("cbr", false, "check cbr backups instead of snapshots")

config.ParseArguments()

env := openstack.NewEnv("OS_", true)
cloud, err := env.Cloud()

if err != nil {
panic(err)
}

providerClient, err := openstack.AuthenticatedClientFromCloud(cloud)

if err != nil {
log.Fatalf("Can't authenticate: %s", err)
}

var bckps []backups.Backup
var snaps []snapshots.Snapshot
var forLength int

if *cbr {

cbrClient, err := openstack.NewCBRService(providerClient, golangsdk.EndpointOpts{})

if err != nil {
log.Fatalf("Problem with cbr Service: %s", err)
}

bckps, err = backups.List(cbrClient, backups.ListOpts{})

forLength = len(bckps)

if err != nil {
log.Fatal(err)
}
} else {
storageClient, err := openstack.NewBlockStorageV2(providerClient, golangsdk.EndpointOpts{})

if err != nil {
log.Fatalf("Problem with evs Service: %s", err)
}

pager := snapshots.List(storageClient, snapshots.ListOpts{})

if err != nil {
log.Fatal(err)
}
pages, err := pager.AllPages()

if err != nil {
log.Fatal(err)
}

snaps, err = snapshots.ExtractSnapshots(pages)

if err != nil {
log.Fatal(err)
}

forLength = len(snaps)

}
currentTime := time.Now()
layout := "2006-01-02T15:04:05.999999"

criticalCount := 0
warningCount := 0
okCount := 0

for i := 0; i < forLength; i++ {

var createdAt time.Time

switch {
case len(bckps) > 0:
createdAtParsed, err := time.Parse(layout, bckps[i].CreatedAt)

if err != nil {
log.Fatal("Could not parse time:", err, createdAtParsed, currentTime)
}

createdAt = createdAtParsed
case len(snaps) > 0:
createdAt = snaps[i].CreatedAt
default:
log.Fatal("Can't check backups.")
}

duration := currentTime.Sub(createdAt)
daysDiff := int(duration.Hours() / 24)

if *critical <= daysDiff {
criticalCount += 1

} else if *warning <= daysDiff {
warningCount += 1
} else {
okCount += 1
}
}

if criticalCount > 0 {
check.Exitf(check.Critical, "%d Snapshots older than %d days", criticalCount, *critical)
} else if warningCount > 0 {
check.Exitf(check.Warning, "%d Snapshots older than %d days", warningCount, *warning)
} else {
check.Exitf(check.OK, "No snapshots (%d) older than %d days", okCount, *warning)
}

}

0 comments on commit f055e72

Please sign in to comment.