Skip to content

Commit 36cd4cf

Browse files
authored
Remove k8s.io/kubernetes dependency (#521)
1 parent bb529ab commit 36cd4cf

File tree

9 files changed

+185
-13
lines changed

9 files changed

+185
-13
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,7 @@ code-review: $(BUILD_TARGETS)/generate golangci copyright ## Full code review a
592592
# ----------------------------------------------------------------------------------------------------------------------
593593
.PHONY: golangci
594594
golangci: $(TOOLS_BIN)/golangci-lint ## Go code review
595-
$(TOOLS_BIN)/golangci-lint run -v --timeout=5m --skip-dirs=.*/fakes --skip-files=zz_.*,generated/*,pkg/data/assets... ./api/... ./controllers/... ./pkg/... ./runner/...
595+
$(TOOLS_BIN)/golangci-lint run -v --timeout=5m --exclude='G402:' --skip-dirs=.*/fakes --skip-files=zz_.*,generated/*,pkg/data/assets... ./api/... ./controllers/... ./pkg/... ./runner/...
596596
$(TOOLS_BIN)/golangci-lint run -v --timeout=5m --exclude='G107:' --exclude='should not use dot imports' ./test/... ./pkg/fakes/...
597597

598598

api/v1/hasher.go

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ package v1
99
import (
1010
"encoding/binary"
1111
"fmt"
12+
"github.com/davecgh/go-spew/spew"
13+
"hash"
1214
"hash/fnv"
1315
"k8s.io/apimachinery/pkg/util/rand"
14-
hashutil "k8s.io/kubernetes/pkg/util/hash"
1516
)
1617

1718
func EnsureHashLabel(c *Coherence) (string, bool) {
@@ -33,7 +34,7 @@ func EnsureHashLabel(c *Coherence) (string, bool) {
3334
// The hash will be safe encoded to avoid bad words.
3435
func ComputeHash(template *CoherenceResourceSpec, collisionCount *int32) string {
3536
podTemplateSpecHasher := fnv.New32a()
36-
hashutil.DeepHashObject(podTemplateSpecHasher, *template)
37+
DeepHashObject(podTemplateSpecHasher, *template)
3738

3839
// Add collisionCount in the hash if it exists.
3940
if collisionCount != nil {
@@ -44,3 +45,17 @@ func ComputeHash(template *CoherenceResourceSpec, collisionCount *int32) string
4445

4546
return rand.SafeEncodeString(fmt.Sprint(podTemplateSpecHasher.Sum32()))
4647
}
48+
49+
// DeepHashObject writes specified object to hash using the spew library
50+
// which follows pointers and prints actual values of the nested objects
51+
// ensuring the hash does not change when a pointer changes.
52+
func DeepHashObject(hasher hash.Hash, objectToWrite interface{}) {
53+
hasher.Reset()
54+
printer := spew.ConfigState{
55+
Indent: " ",
56+
SortKeys: true,
57+
DisableMethods: true,
58+
SpewKeys: true,
59+
}
60+
_, _ = printer.Fprintf(hasher, "%#v", objectToWrite)
61+
}

controllers/statefulset/http.go

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
/*
2+
* Copyright (c) 2021, Oracle and/or its affiliates.
3+
* Licensed under the Universal Permissive License v 1.0 as shown at
4+
* http://oss.oracle.com/licenses/upl.
5+
*/
6+
7+
package statefulset
8+
9+
import (
10+
"crypto/tls"
11+
"fmt"
12+
"github.com/oracle/coherence-operator/pkg/operator"
13+
"io/ioutil"
14+
"k8s.io/apimachinery/pkg/util/net"
15+
"net/http"
16+
"net/url"
17+
"time"
18+
)
19+
20+
// NewHTTPProbe creates Probe that will skip TLS verification while probing.
21+
func NewHTTPProbe() HTTPProbe {
22+
tlsConfig := &tls.Config{InsecureSkipVerify: true}
23+
return NewHTTPProbeWithTLSConfig(tlsConfig)
24+
}
25+
26+
// NewHTTPProbeWithTLSConfig takes tls config as parameter.
27+
func NewHTTPProbeWithTLSConfig(config *tls.Config) HTTPProbe {
28+
transport := net.SetTransportDefaults(&http.Transport{TLSClientConfig: config, DisableKeepAlives: true})
29+
return httpProbe{transport}
30+
}
31+
32+
// HTTPProbe is an interface that defines the Probe function for doing HTTP readiness/liveness checks.
33+
type HTTPProbe interface {
34+
Probe(url *url.URL, headers http.Header, timeout time.Duration) (Result, string, error)
35+
}
36+
37+
type httpProbe struct {
38+
transport *http.Transport
39+
}
40+
41+
// Probe returns a ProbeRunner capable of running an HTTP check.
42+
func (pr httpProbe) Probe(url *url.URL, headers http.Header, timeout time.Duration) (Result, string, error) {
43+
return DoHTTPProbe(url, headers, &http.Client{Timeout: timeout, Transport: pr.transport})
44+
}
45+
46+
// GetHTTPInterface is an interface for making HTTP requests, that returns a response and error.
47+
type GetHTTPInterface interface {
48+
Do(req *http.Request) (*http.Response, error)
49+
}
50+
51+
// DoHTTPProbe checks if a GET request to the url succeeds.
52+
// If the HTTP response code is successful (i.e. 400 > code >= 200), it returns Success.
53+
// If the HTTP response code is unsuccessful or HTTP communication fails, it returns Failure.
54+
// This is exported because some other packages may want to do direct HTTP probes.
55+
func DoHTTPProbe(url *url.URL, headers http.Header, client GetHTTPInterface) (Result, string, error) {
56+
req, err := http.NewRequest("GET", url.String(), nil)
57+
if err != nil {
58+
// Convert errors into failures to catch timeouts.
59+
return Failure, err.Error(), nil
60+
}
61+
if _, ok := headers["User-Agent"]; !ok {
62+
if headers == nil {
63+
headers = http.Header{}
64+
}
65+
// explicitly set User-Agent, so it's not set to default Go value
66+
headers.Set("User-Agent", fmt.Sprintf("coherence-operator/%s", operator.GetVersion()))
67+
}
68+
req.Header = headers
69+
if headers.Get("Host") != "" {
70+
req.Host = headers.Get("Host")
71+
}
72+
res, err := client.Do(req)
73+
if err != nil {
74+
// Convert errors into failures to catch timeouts.
75+
return Failure, err.Error(), nil
76+
}
77+
defer closeBody(res)
78+
b, err := ioutil.ReadAll(res.Body)
79+
if err != nil {
80+
return Failure, "", err
81+
}
82+
body := string(b)
83+
if res.StatusCode >= http.StatusOK && res.StatusCode < http.StatusBadRequest {
84+
return Success, body, nil
85+
}
86+
return Failure, fmt.Sprintf("HTTP probe failed with statuscode: %d", res.StatusCode), nil
87+
}
88+
89+
func closeBody(res *http.Response) {
90+
// close the response body, ignoring any errors
91+
_ = res.Body.Close()
92+
}

controllers/statefulset/probe.go

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,25 @@ import (
1717
corev1 "k8s.io/api/core/v1"
1818
"k8s.io/apimachinery/pkg/util/intstr"
1919
"k8s.io/client-go/rest"
20-
"k8s.io/kubernetes/pkg/probe"
21-
httpprobe "k8s.io/kubernetes/pkg/probe/http"
22-
tcprobe "k8s.io/kubernetes/pkg/probe/tcp"
2320
"net/http"
2421
"net/url"
2522
"sigs.k8s.io/controller-runtime/pkg/client"
2623
"strconv"
2724
"strings"
2825
)
2926

27+
// Result is a string used to handle the results for probing container readiness/livenss
28+
type Result string
29+
30+
const (
31+
// Success Result
32+
Success Result = "success"
33+
// Failure Result
34+
Failure Result = "failure"
35+
// Unknown Result
36+
Unknown Result = "unknown"
37+
)
38+
3039
type CoherenceProbe struct {
3140
Client client.Client
3241
Config *rest.Config
@@ -270,12 +279,12 @@ func (in *CoherenceProbe) ProbeUsingHTTP(pod corev1.Pod, handler *coh.Probe) (bo
270279
}
271280
}
272281

273-
p := httpprobe.New()
282+
p := NewHTTPProbe()
274283
result, s, err := p.Probe(u, header, handler.GetTimeout())
275284

276285
log.Info(fmt.Sprintf("HTTP Probe URL: %s result=%v msg=%s error=%v", u.String(), result, s, err))
277286

278-
return result == probe.Success, err
287+
return result == Success, err
279288
}
280289

281290
func (in *CoherenceProbe) ProbeUsingTCP(pod corev1.Pod, handler *coh.Probe) (bool, error) {
@@ -297,12 +306,12 @@ func (in *CoherenceProbe) ProbeUsingTCP(pod corev1.Pod, handler *coh.Probe) (boo
297306
return false, err
298307
}
299308

300-
p := tcprobe.New()
309+
p := NewTCPProbe()
301310
result, _, err := p.Probe(host, port, handler.GetTimeout())
302311

303312
log.Info(fmt.Sprintf("TCP Probe: %s:%d result=%s error=%s", host, port, result, err))
304313

305-
return result == probe.Success, err
314+
return result == Success, err
306315
}
307316

308317
func (in *CoherenceProbe) findPort(pod corev1.Pod, port intstr.IntOrString) (int, error) {

controllers/statefulset/tcp.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
* Copyright (c) 2021, Oracle and/or its affiliates.
3+
* Licensed under the Universal Permissive License v 1.0 as shown at
4+
* http://oss.oracle.com/licenses/upl.
5+
*/
6+
7+
package statefulset
8+
9+
import (
10+
"net"
11+
"strconv"
12+
"time"
13+
)
14+
15+
// NewTCPProbe creates TCPProbe.
16+
func NewTCPProbe() TCPProbe {
17+
return tcpProbe{}
18+
}
19+
20+
// TCPProbe is an interface that defines the Probe function for doing TCP readiness/liveness checks.
21+
type TCPProbe interface {
22+
Probe(host string, port int, timeout time.Duration) (Result, string, error)
23+
}
24+
25+
type tcpProbe struct{}
26+
27+
// Probe returns a ProbeRunner capable of running an TCP check.
28+
func (pr tcpProbe) Probe(host string, port int, timeout time.Duration) (Result, string, error) {
29+
return DoTCPProbe(net.JoinHostPort(host, strconv.Itoa(port)), timeout)
30+
}
31+
32+
// DoTCPProbe checks that a TCP socket to the address can be opened.
33+
// If the socket can be opened, it returns Success
34+
// If the socket fails to open, it returns Failure.
35+
// This is exported because some other packages may want to do direct TCP probes.
36+
func DoTCPProbe(addr string, timeout time.Duration) (Result, string, error) {
37+
conn, err := net.DialTimeout("tcp", addr, timeout)
38+
if err != nil {
39+
// Convert errors to failures to handle timeouts.
40+
return Failure, err.Error(), nil
41+
}
42+
err = conn.Close()
43+
if err != nil {
44+
log.Error(err, "Unexpected error closing TCP probe socket")
45+
}
46+
return Success, "", nil
47+
}

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ go 1.16
44

55
require (
66
github.com/coreos/prometheus-operator v0.38.1-0.20200424145508-7e176fda06cc
7+
github.com/davecgh/go-spew v1.1.1
78
github.com/elastic/go-elasticsearch/v7 v7.6.0
89
github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32
910
github.com/go-logr/logr v0.4.0
@@ -19,7 +20,6 @@ require (
1920
k8s.io/apiextensions-apiserver v0.22.2
2021
k8s.io/apimachinery v0.22.2
2122
k8s.io/client-go v12.0.0+incompatible
22-
k8s.io/kubernetes v1.13.0
2323
k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a
2424
sigs.k8s.io/controller-runtime v0.10.0
2525
sigs.k8s.io/testing_frameworks v0.1.2

go.sum

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1243,8 +1243,6 @@ k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C
12431243
k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
12441244
k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e h1:KLHHjkdQFomZy8+06csTWZ0m1343QqxZhR2LJ1OxCYM=
12451245
k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw=
1246-
k8s.io/kubernetes v1.13.0 h1:qTfB+u5M92k2fCCCVP2iuhgwwSOv1EkAkvQY1tQODD8=
1247-
k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=
12481246
k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
12491247
k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
12501248
k8s.io/utils v0.0.0-20191114200735-6ca3b61696b6/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=

main.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,8 @@ func execute() {
216216
func initialiseOperator(ctx context.Context, v *version.Version, cl client.Client) {
217217
opLog := ctrl.Log.WithName("operator")
218218

219+
operator.SetVersion(Version)
220+
219221
// Ensure that the CRDs exist
220222
if operator.ShouldInstallCRDs() {
221223
err := coh.EnsureCRDs(ctx, v, scheme, cl)

pkg/operator/operator.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ const (
7070
var setupLog = ctrl.Log.WithName("setup")
7171

7272
var (
73+
operatorVersion = "unknown"
7374
DefaultSiteLabels = []string{corev1.LabelTopologyZone, corev1.LabelFailureDomainBetaZone}
7475
DefaultRackLabels = []string{corev1.LabelTopologyRegion, corev1.LabelFailureDomainBetaRegion,
7576
corev1.LabelTopologyZone, corev1.LabelFailureDomainBetaZone}
@@ -315,3 +316,11 @@ func DetectKubernetesVersion(cs clients.ClientSet) (*version.Version, error) {
315316
}
316317
return version.ParseSemantic(sv.GitVersion)
317318
}
319+
320+
func GetVersion() string {
321+
return operatorVersion
322+
}
323+
324+
func SetVersion(v string) {
325+
operatorVersion = v
326+
}

0 commit comments

Comments
 (0)