Skip to content

Commit 37bddae

Browse files
committed
basic CRD(+L)
1 parent 20d34fa commit 37bddae

File tree

6 files changed

+304
-6
lines changed

6 files changed

+304
-6
lines changed

cmd/proxy.go

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
package cmd
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"os"
7+
8+
"github.com/spf13/cobra"
9+
"golang.org/x/exp/slog"
10+
11+
"github.com/apoxy-dev/apoxy-cli/api/core/v1alpha"
12+
)
13+
14+
// proxyCmd represents the proxy command
15+
var proxyCmd = &cobra.Command{
16+
Use: "proxy",
17+
Short: "Manage proxy objects",
18+
Long: `The core object in the Apoxy API.`,
19+
Aliases: []string{"p", "proxies"},
20+
Run: func(cmd *cobra.Command, args []string) {
21+
fmt.Println("proxy called")
22+
},
23+
}
24+
25+
// getProxyCmd represents the get proxy command
26+
var getProxyCmd = &cobra.Command{
27+
Use: "get <name>",
28+
Short: "Get proxy objects",
29+
ValidArgs: []string{"name"},
30+
Args: cobra.ExactArgs(1),
31+
RunE: func(cmd *cobra.Command, args []string) error {
32+
c, err := defaultAPIClient()
33+
if err != nil {
34+
return err
35+
}
36+
r, err := c.Proxy().Get(args[0])
37+
if err != nil {
38+
return err
39+
}
40+
// TODO: pretty print.
41+
fmt.Println(r)
42+
return nil
43+
},
44+
}
45+
46+
// listProxyCmd represents the list proxy command
47+
var listProxyCmd = &cobra.Command{
48+
Use: "list",
49+
Short: "List proxy objects",
50+
RunE: func(cmd *cobra.Command, args []string) error {
51+
c, err := defaultAPIClient()
52+
if err != nil {
53+
return err
54+
}
55+
r, err := c.Proxy().List()
56+
if err != nil {
57+
return err
58+
}
59+
// TODO: pretty print.
60+
fmt.Println(r)
61+
return nil
62+
},
63+
}
64+
65+
// proxyFile is the file that contains the configuration to create.
66+
var proxyFile string
67+
68+
// createProxyCmd represents the create proxy command
69+
var createProxyCmd = &cobra.Command{
70+
Use: "create [-f filename]",
71+
Short: "Create proxy objects",
72+
Long: `Create proxy objects by providing a configuration as a file or via stdin.`,
73+
RunE: func(cmd *cobra.Command, args []string) error {
74+
c, err := defaultAPIClient()
75+
if err != nil {
76+
return err
77+
}
78+
79+
// Load the config to create from a file or stdin.
80+
var proxyConfig string
81+
stat, _ := os.Stdin.Stat()
82+
if stat.Mode()&os.ModeCharDevice == 0 {
83+
if proxyFile != "" {
84+
return fmt.Errorf("cannot use --filename with stdin")
85+
}
86+
proxyConfig, err = readStdInAsString()
87+
} else if proxyFile != "" {
88+
proxyConfig, err = readFileAsString(proxyFile)
89+
} else {
90+
return fmt.Errorf("please provide a configuration via --filename or stdin")
91+
}
92+
93+
if err != nil {
94+
return err
95+
}
96+
97+
// Parse proxyConfig into a proxy object.
98+
proxy := &v1alpha.Proxy{}
99+
proxyJSON, err := yamlStringToJSONString(proxyConfig)
100+
if err != nil {
101+
// Try assuming that the config is a JSON string?
102+
slog.Debug("failed to parse proxy config as yaml - assuming input is JSON", "error", err)
103+
proxyJSON = proxyConfig
104+
}
105+
err = json.Unmarshal([]byte(proxyJSON), proxy)
106+
if err != nil {
107+
return err
108+
}
109+
110+
r, err := c.Proxy().Create(proxy)
111+
if err != nil {
112+
return err
113+
}
114+
// TODO: pretty print.
115+
fmt.Println(r)
116+
return nil
117+
},
118+
}
119+
120+
// deleteProxyCmd represents the delete proxy command
121+
var deleteProxyCmd = &cobra.Command{
122+
Use: "delete",
123+
Short: "Delete proxy objects",
124+
RunE: func(cmd *cobra.Command, args []string) error {
125+
c, err := defaultAPIClient()
126+
if err != nil {
127+
return err
128+
}
129+
if err = c.Proxy().Delete(args[0]); err != nil {
130+
return err
131+
}
132+
fmt.Printf("proxy %q deleted\n", args[0])
133+
return nil
134+
},
135+
}
136+
137+
func init() {
138+
createProxyCmd.PersistentFlags().
139+
StringVarP(&proxyFile, "filename", "f", "", "The file that contains the configuration to create.")
140+
// TODO: add flags for proxy config as raw envoy config
141+
142+
proxyCmd.AddCommand(getProxyCmd, listProxyCmd, createProxyCmd, deleteProxyCmd)
143+
rootCmd.AddCommand(proxyCmd)
144+
}

cmd/root.go

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
package cmd
22

33
import (
4+
"bufio"
5+
"encoding/json"
6+
"fmt"
47
"os"
58

69
"github.com/spf13/cobra"
10+
"golang.org/x/exp/slog"
11+
"gopkg.in/yaml.v3"
712

813
"github.com/apoxy-dev/apoxy-cli/config"
14+
"github.com/apoxy-dev/apoxy-cli/rest"
915
)
1016

1117
// rootCmd represents the base command when called without any subcommands
@@ -16,9 +22,6 @@ var rootCmd = &cobra.Command{
1622
1723
Start by creating an account on https://apoxy.dev and logging in with 'apoxy auth'.
1824
`,
19-
// Uncomment the following line if your bare application
20-
// has an action associated with it:
21-
// Run: func(cmd *cobra.Command, args []string) { },
2225
}
2326

2427
// Execute adds all child commands to the root command and sets flags appropriately.
@@ -34,3 +37,53 @@ func init() {
3437
rootCmd.PersistentFlags().StringVar(&config.ConfigFile, "config", "", "config file (default is $HOME/.apoxy/config.yaml)")
3538
rootCmd.PersistentFlags().BoolVarP(&config.Verbose, "verbose", "v", false, "enable verbose output")
3639
}
40+
41+
// TODO: Move the following functions to a separate file?
42+
43+
// defaultAPIClient returns a new Apoxy API client.
44+
func defaultAPIClient() (*rest.APIClient, error) {
45+
cfg, err := config.Load()
46+
if err != nil {
47+
return nil, err
48+
}
49+
return rest.NewAPIClient(cfg.APIBaseURL, cfg.APIBaseHost, cfg.APIKey, cfg.ProjectID)
50+
}
51+
52+
// readFileAsString returns a file as a string or an error.
53+
func readFileAsString(filename string) (string, error) {
54+
slog.Debug("Reading from file", "filename", filename)
55+
data, err := os.ReadFile(filename)
56+
if err != nil {
57+
return "", err
58+
}
59+
return string(data), nil
60+
}
61+
62+
// readStdInAsString returns stdin as a string or an error.
63+
func readStdInAsString() (string, error) {
64+
slog.Debug("Reading from stdin")
65+
scanner := bufio.NewScanner(os.Stdin)
66+
var input string
67+
for scanner.Scan() {
68+
text := scanner.Text()
69+
input += text + "\n"
70+
}
71+
if err := scanner.Err(); err != nil {
72+
return "", fmt.Errorf("Error reading from stdin: %v", err)
73+
}
74+
return input, nil
75+
}
76+
77+
// yamlStringToJSONString converts a YAML string to a JSON string.
78+
func yamlStringToJSONString(yamlString string) (string, error) {
79+
var data interface{}
80+
err := yaml.Unmarshal([]byte(yamlString), &data)
81+
if err != nil {
82+
return "", err
83+
}
84+
jsonBytes, err := json.Marshal(data)
85+
if err != nil {
86+
return "", err
87+
}
88+
return string(jsonBytes), nil
89+
}

go.mod

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@ require (
1111
)
1212

1313
require (
14+
github.com/beorn7/perks v1.0.1 // indirect
15+
github.com/blang/semver/v4 v4.0.0 // indirect
16+
github.com/cespare/xxhash/v2 v2.2.0 // indirect
1417
github.com/davecgh/go-spew v1.1.1 // indirect
15-
github.com/emicklei/go-restful/v3 v3.9.0 // indirect
18+
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
1619
github.com/go-logr/logr v1.2.4 // indirect
1720
github.com/go-openapi/jsonpointer v0.19.6 // indirect
1821
github.com/go-openapi/jsonreference v0.20.2 // indirect
@@ -27,9 +30,14 @@ require (
2730
github.com/josharian/intern v1.0.0 // indirect
2831
github.com/json-iterator/go v1.1.12 // indirect
2932
github.com/mailru/easyjson v0.7.7 // indirect
33+
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
3034
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
3135
github.com/modern-go/reflect2 v1.0.2 // indirect
3236
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
37+
github.com/prometheus/client_golang v1.16.0 // indirect
38+
github.com/prometheus/client_model v0.4.0 // indirect
39+
github.com/prometheus/common v0.44.0 // indirect
40+
github.com/prometheus/procfs v0.10.1 // indirect
3341
github.com/spf13/pflag v1.0.5 // indirect
3442
golang.org/x/net v0.17.0 // indirect
3543
golang.org/x/oauth2 v0.8.0 // indirect
@@ -43,9 +51,13 @@ require (
4351
gopkg.in/yaml.v2 v2.4.0 // indirect
4452
k8s.io/api v0.28.4 // indirect
4553
k8s.io/apimachinery v0.28.4 // indirect
54+
k8s.io/apiserver v0.28.4 // indirect
55+
k8s.io/component-base v0.28.4 // indirect
4656
k8s.io/klog/v2 v2.100.1 // indirect
4757
k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 // indirect
4858
k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 // indirect
59+
sigs.k8s.io/apiserver-runtime v1.1.1 // indirect
60+
sigs.k8s.io/controller-runtime v0.16.3 // indirect
4961
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
5062
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
5163
sigs.k8s.io/yaml v1.3.0 // indirect

go.sum

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
1+
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
2+
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
3+
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
4+
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
5+
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
6+
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
17
github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
28
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
39
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
410
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
511
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
612
github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE=
713
github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
14+
github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
815
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
916
github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
1017
github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
@@ -16,6 +23,7 @@ github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/
1623
github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
1724
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
1825
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
26+
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
1927
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
2028
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
2129
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
@@ -44,6 +52,8 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
4452
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
4553
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
4654
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
55+
github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
56+
github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
4757
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
4858
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
4959
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -54,6 +64,14 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8m
5464
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU=
5565
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI=
5666
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
67+
github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8=
68+
github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc=
69+
github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY=
70+
github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU=
71+
github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY=
72+
github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY=
73+
github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg=
74+
github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM=
5775
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
5876
github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0=
5977
github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho=
@@ -84,6 +102,7 @@ golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
84102
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
85103
golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8=
86104
golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE=
105+
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
87106
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
88107
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
89108
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -130,14 +149,22 @@ k8s.io/api v0.28.4 h1:8ZBrLjwosLl/NYgv1P7EQLqoO8MGQApnbgH8tu3BMzY=
130149
k8s.io/api v0.28.4/go.mod h1:axWTGrY88s/5YE+JSt4uUi6NMM+gur1en2REMR7IRj0=
131150
k8s.io/apimachinery v0.28.4 h1:zOSJe1mc+GxuMnFzD4Z/U1wst50X28ZNsn5bhgIIao8=
132151
k8s.io/apimachinery v0.28.4/go.mod h1:wI37ncBvfAoswfq626yPTe6Bz1c22L7uaJ8dho83mgg=
152+
k8s.io/apiserver v0.28.4 h1:BJXlaQbAU/RXYX2lRz+E1oPe3G3TKlozMMCZWu5GMgg=
153+
k8s.io/apiserver v0.28.4/go.mod h1:Idq71oXugKZoVGUUL2wgBCTHbUR+FYTWa4rq9j4n23w=
133154
k8s.io/client-go v0.28.4 h1:Np5ocjlZcTrkyRJ3+T3PkXDpe4UpatQxj85+xjaD2wY=
134155
k8s.io/client-go v0.28.4/go.mod h1:0VDZFpgoZfelyP5Wqu0/r/TRYcLYuJ2U1KEeoaPa1N4=
156+
k8s.io/component-base v0.28.4 h1:c/iQLWPdUgI90O+T9TeECg8o7N3YJTiuz2sKxILYcYo=
157+
k8s.io/component-base v0.28.4/go.mod h1:m9hR0uvqXDybiGL2nf/3Lf0MerAfQXzkfWhUY58JUbU=
135158
k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg=
136159
k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
137160
k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9 h1:LyMgNKD2P8Wn1iAwQU5OhxCKlKJy0sHc+PcDwFB24dQ=
138161
k8s.io/kube-openapi v0.0.0-20230717233707-2695361300d9/go.mod h1:wZK2AVp1uHCp4VamDVgBP2COHZjqD1T68Rf0CM3YjSM=
139162
k8s.io/utils v0.0.0-20230406110748-d93618cff8a2 h1:qY1Ad8PODbnymg2pRbkyMT/ylpTrCM8P2RJ0yroCyIk=
140163
k8s.io/utils v0.0.0-20230406110748-d93618cff8a2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
164+
sigs.k8s.io/apiserver-runtime v1.1.1 h1:cN/+Gq78DKGxQHi7j+bET4/h54vg9VEwg5atJV5YbCI=
165+
sigs.k8s.io/apiserver-runtime v1.1.1/go.mod h1:cmahVEn9R791yUnSiFMFdwTqi2dOe5WQRNwcY6jb7l0=
166+
sigs.k8s.io/controller-runtime v0.16.3 h1:2TuvuokmfXvDUamSx1SuAOO3eTyye+47mJCigwG62c4=
167+
sigs.k8s.io/controller-runtime v0.16.3/go.mod h1:j7bialYoSn142nv9sCOJmQgDXQXxnroFU4VnX/brVJ0=
141168
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
142169
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
143170
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=

rest/k8s.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,22 @@ func NewK8SClient(baseURL, baseHost, apiKey, projectID string) (*K8SClient, erro
3737
UserAgent: build.UserAgent(),
3838
}
3939
if baseHost != "" {
40+
config.Host = baseURL
4041
config.TLSClientConfig = rest.TLSClientConfig{
4142
Insecure: true,
4243
ServerName: fmt.Sprintf("%s.%s", projectID, baseHost),
4344
}
4445
}
4546
config.WrapTransport = func(rt http.RoundTripper) http.RoundTripper {
46-
return &headerTransport{
47+
ht := &headerTransport{
4748
roundTripper: rt,
4849
apiKey: apiKey,
4950
projectID: projectID,
5051
}
52+
if baseHost != "" {
53+
ht.host = fmt.Sprintf("%s.%s", projectID, baseHost)
54+
}
55+
return ht
5156
}
5257
client, err := dynamic.NewForConfig(config)
5358
if err != nil {
@@ -62,11 +67,15 @@ type headerTransport struct {
6267
roundTripper http.RoundTripper
6368
apiKey string
6469
projectID string
70+
host string
6571
}
6672

6773
func (t *headerTransport) RoundTrip(req *http.Request) (*http.Response, error) {
6874
req.Header.Set("X-Apoxy-API-Key", t.apiKey)
6975
req.Header.Set("X-Apoxy-Project-Id", t.projectID)
7076
req.Header.Set("User-Agent", build.UserAgent())
77+
if t.host != "" {
78+
req.Host = t.host
79+
}
7180
return t.roundTripper.RoundTrip(req)
7281
}

0 commit comments

Comments
 (0)