Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

migrate rorclient and config from nhn-ror. and add pvc metric #54

Merged
merged 1 commit into from
Mar 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions pkg/apicontracts/metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,18 @@ import (
"github.com/NorskHelsenett/ror/pkg/apicontracts/apiresourcecontracts"
)

type MetricMetadata struct {
Type string `json:"type" bson:"type"`
ClusterId string `json:"clusterId" bson:"clusterId"`
Name string `json:"name" bson:"name"`
}

type PersistentVolumeClaimMetric struct {
Metadata MetricMetadata `json:"metadata" bson:"metadata"`
Timestamp time.Time `json:"timestamp" bson:"timestamp"`
RequestedAllocation string `json:"requestedAllocation" bson:"requestedAllocation"`
}

type PodMetricsList struct {
Kind string `json:"kind"`
APIVersion string `json:"apiVersion"`
Expand Down
78 changes: 78 additions & 0 deletions pkg/clients/rorclient/client.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package rorclient

import (
"github.com/NorskHelsenett/ror/pkg/clients/rorclient/transports"
v1clusters "github.com/NorskHelsenett/ror/pkg/clients/rorclient/v1/clusters"
v1datacenter "github.com/NorskHelsenett/ror/pkg/clients/rorclient/v1/datacenter"
v1info "github.com/NorskHelsenett/ror/pkg/clients/rorclient/v1/info"
v1metrics "github.com/NorskHelsenett/ror/pkg/clients/rorclient/v1/metrics"
v1projects "github.com/NorskHelsenett/ror/pkg/clients/rorclient/v1/projects"
v1resources "github.com/NorskHelsenett/ror/pkg/clients/rorclient/v1/resources"
v1workspaces "github.com/NorskHelsenett/ror/pkg/clients/rorclient/v1/workspaces"
"github.com/NorskHelsenett/ror/pkg/clients/rorclient/v2/rorclientv2self"
)

type RorConfig struct {
Host string
}

type RorClient struct {
Transport transports.RorTransport
infoClientV1 v1info.InfoInterface
datacenterClientV1 v1datacenter.DatacenterInterface
clustersClientV1 v1clusters.ClustersInterface
workspacesClientV1 v1workspaces.WorkspacesInterface
selfClientV2 rorclientv2self.SelfInterface
projectsClientV1 v1projects.ProjectsInterface
resourceClientV1 v1resources.ResourceInterface
metricsClientV1 v1metrics.MetricsInterface
}

func NewRorClient(transport transports.RorTransport) *RorClient {
return &RorClient{
Transport: transport,
infoClientV1: transport.Info(),
datacenterClientV1: transport.Datacenters(),
clustersClientV1: transport.Clusters(),
workspacesClientV1: transport.Workspaces(),
projectsClientV1: transport.Projects(),
selfClientV2: transport.Self(),
resourceClientV1: transport.Resources(),
metricsClientV1: transport.Metrics(),
}
}

func (c *RorClient) SetTransport(transport transports.RorTransport) {
c.Transport = transport
}
func (c *RorClient) Info() v1info.InfoInterface {
return c.infoClientV1
}
func (c *RorClient) Self() rorclientv2self.SelfInterface {
return c.selfClientV2
}

func (c *RorClient) Datacenters() v1datacenter.DatacenterInterface {
return c.datacenterClientV1
}
func (c *RorClient) Clusters() v1clusters.ClustersInterface {
return c.clustersClientV1
}
func (c *RorClient) Workspaces() v1workspaces.WorkspacesInterface {
return c.workspacesClientV1
}

func (c *RorClient) Projects() v1projects.ProjectsInterface {
return c.projectsClientV1
}
func (c *RorClient) Metrics() v1metrics.MetricsInterface {
return c.metricsClientV1
}

func (c *RorClient) Resources() v1resources.ResourceInterface {
return c.resourceClientV1
}

func (c *RorClient) Ping() error {
return c.Transport.Ping()
}
4 changes: 4 additions & 0 deletions pkg/clients/rorclient/replace
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/bin/sh

find . -type f -exec sed -i \
's/ror\/internal\/clients/github.com\/NorskHelsenett\/ror\/pkg\/clients/g' {} +
24 changes: 24 additions & 0 deletions pkg/clients/rorclient/transports/interfaces.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package transports

import (
v1clusters "github.com/NorskHelsenett/ror/pkg/clients/rorclient/v1/clusters"
v1datacenter "github.com/NorskHelsenett/ror/pkg/clients/rorclient/v1/datacenter"
v1info "github.com/NorskHelsenett/ror/pkg/clients/rorclient/v1/info"
v1metrics "github.com/NorskHelsenett/ror/pkg/clients/rorclient/v1/metrics"
v1projects "github.com/NorskHelsenett/ror/pkg/clients/rorclient/v1/projects"
v1resources "github.com/NorskHelsenett/ror/pkg/clients/rorclient/v1/resources"
v1workspaces "github.com/NorskHelsenett/ror/pkg/clients/rorclient/v1/workspaces"
"github.com/NorskHelsenett/ror/pkg/clients/rorclient/v2/rorclientv2self"
)

type RorTransport interface {
Info() v1info.InfoInterface
Datacenters() v1datacenter.DatacenterInterface
Clusters() v1clusters.ClustersInterface
Self() rorclientv2self.SelfInterface
Workspaces() v1workspaces.WorkspacesInterface
Projects() v1projects.ProjectsInterface
Resources() v1resources.ResourceInterface
Metrics() v1metrics.MetricsInterface
Ping() error
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package mocktransportinfo

type V1Client struct {
}

func NewV1Client() *V1Client {
return &V1Client{}
}

func (c *V1Client) GetVersion() (string, error) {
return "1.1.1", nil
}
21 changes: 21 additions & 0 deletions pkg/clients/rorclient/transports/mocktransport/transport.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package mocktransport

import (
"github.com/NorskHelsenett/ror/pkg/clients/rorclient/transports/mocktransport/mocktransportinfo"
v1info "github.com/NorskHelsenett/ror/pkg/clients/rorclient/v1/info"
)

type RorMockTransport struct {
infoClientV1 v1info.InfoInterface
}

func NewRorMockTransport() *RorMockTransport {
t := &RorMockTransport{
infoClientV1: mocktransportinfo.NewV1Client(),
}
return t
}

func (t *RorMockTransport) Info() v1info.InfoInterface {
return t.infoClientV1
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package httpauthprovider

import (
"fmt"
"net/http"
)

type AuthProviderType string

const (
AuthPoviderTypeAPIKey AuthProviderType = "APIKEY"
AuthProviderTypeBearer AuthProviderType = "BEARER"
)

type AuthProvider struct {
Type AuthProviderType
Secret string
}

func NewAuthProvider(providertype AuthProviderType, secret string) *AuthProvider {
return &AuthProvider{
Type: providertype,
Secret: secret,
}
}

func (a *AuthProvider) AddAuthHeaders(req *http.Request) {
switch a.Type {
case AuthPoviderTypeAPIKey:
req.Header.Add("X-API-KEY", a.Secret)
case AuthProviderTypeBearer:
req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", a.Secret))
req.Header.Add("Flow", "device")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package httpauthprovider

import "net/http"

type NoAuthprovider struct {
}

func NewNoAuthprovider() *NoAuthprovider {
return &NoAuthprovider{}
}

func (a NoAuthprovider) AddAuthHeaders(req *http.Request) {

}
180 changes: 180 additions & 0 deletions pkg/clients/rorclient/transports/resttransport/httpclient/client.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,180 @@
package httpclient

import (
"bytes"
"encoding/json"
"fmt"
"github.com/NorskHelsenett/ror/pkg/config/rorversion"
"io"
"net/http"
)

type HttpTransportClientParams string

const (
HttpTransportClientParamsNoAuth HttpTransportClientParams = "NOAUTH"
)

type HttpTransportClientConfig struct {
BaseURL string
AuthProvider HttpTransportAuthProvider
Role string
Version rorversion.RorVersion
}

type HttpTransportAuthProvider interface {
AddAuthHeaders(req *http.Request)
}

type HttpTransportClient struct {
Client *http.Client
Config *HttpTransportClientConfig
}

func (t *HttpTransportClient) GetJSON(path string, out any, params ...HttpTransportClientParams) error {
var noAuth bool
req, err := http.NewRequest("GET", t.Config.BaseURL+path, nil)
if err != nil {
return err
}

if len(params) != 0 {
for _, param := range params {
switch param {
case HttpTransportClientParamsNoAuth:
noAuth = true
}
}
}

t.AddCommonHeaders(req)
if !noAuth {
t.AddAuthHeaders(req)
}

req.Header.Add("Accept", `application/json`)

res, err := t.Client.Do(req)
if err != nil {
return err
}

if res.StatusCode > 399 || res.StatusCode < 200 {
return fmt.Errorf("http error: %s from %s", res.Status, res.Request.URL)
}

defer res.Body.Close()

body, err := io.ReadAll(res.Body)
if err != nil {
return err
}

err = json.Unmarshal(body, out)
if err != nil {
return err
}

return nil
}

func (t *HttpTransportClient) PostJSON(path string, inn any, out any, params ...HttpTransportClientParams) error {
var noAuth bool

jsonData, err := json.Marshal(inn)
req, err := http.NewRequest("POST", t.Config.BaseURL+path, bytes.NewBuffer(jsonData))
if err != nil {
return err
}

if len(params) != 0 {
for _, param := range params {
switch param {
case HttpTransportClientParamsNoAuth:
noAuth = true
}
}
}

t.AddCommonHeaders(req)
if !noAuth {
t.AddAuthHeaders(req)
}

res, err := t.Client.Do(req)
if err != nil {
return err
}
defer res.Body.Close()

if res.StatusCode > 399 || res.StatusCode < 200 {
return fmt.Errorf("http error: %s from %s", res.Status, res.Request.URL)
}

body, err := io.ReadAll(res.Body)
if err != nil {
return err
}

err = json.Unmarshal(body, out)
if err != nil {
return err
}

return nil
}

func (t *HttpTransportClient) PutJSON(path string, inn any, out any, params ...HttpTransportClientParams) error {
var noAuth bool

jsonData, err := json.Marshal(inn)
req, err := http.NewRequest("PUT", t.Config.BaseURL+path, bytes.NewBuffer(jsonData))
if err != nil {
return err
}

if len(params) != 0 {
for _, param := range params {
switch param {
case HttpTransportClientParamsNoAuth:
noAuth = true
}
}
}

t.AddCommonHeaders(req)
if !noAuth {
t.AddAuthHeaders(req)
}

res, err := t.Client.Do(req)
if err != nil {
return err
}
defer res.Body.Close()

if res.StatusCode > 399 || res.StatusCode < 200 {
return fmt.Errorf("http error: %s from %s", res.Status, res.Request.URL)
}

body, err := io.ReadAll(res.Body)
if err != nil {
return err
}

err = json.Unmarshal(body, out)
if err != nil {
return err
}

return nil
}

func (t *HttpTransportClient) AddAuthHeaders(req *http.Request) {
t.Config.AuthProvider.AddAuthHeaders(req)
}
func (t *HttpTransportClient) AddCommonHeaders(req *http.Request) {
req.Header.Set("User-Agent", fmt.Sprintf("%s - v%s (%s)", t.Config.Role, t.Config.Version.GetVersion(), t.Config.Version.GetCommit()))
req.Header.Add("Accept", `application/json`)
req.Header.Add("Content-Type", `application/json`)
}
Loading
Loading