Skip to content

Commit 886b462

Browse files
authored
integration test for cloudevents client (#275)
Signed-off-by: Wei Liu <[email protected]>
1 parent cf1ead4 commit 886b462

File tree

135 files changed

+25125
-16
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

135 files changed

+25125
-16
lines changed

.github/workflows/go.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,5 +99,7 @@ jobs:
9999
uses: actions/setup-go@v3
100100
with:
101101
go-version: ${{ env.GO_VERSION }}
102-
- name: integration
103-
run: make test-integration
102+
- name: api-integration
103+
run: make test-api-integration
104+
- name: cloudevents-integration
105+
run: make test-cloudevents-integration

cloudevents/README.md

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
# Cloudevents Clients
2+
3+
We have implemented the [cloudevents](https://cloudevents.io/)-based clients in this package to assist developers in
4+
easily implementing the [Event Based Manifestwork](https://github.com/open-cluster-management-io/enhancements/tree/main/enhancements/sig-architecture/224-event-based-manifestwork)
5+
proposal.
6+
7+
## Generic Clients
8+
9+
The generic client (`generic.CloudEventsClient`) is used to resync/publish/subscribe resource objects between sources
10+
and agents with cloudevents.
11+
12+
A resource object can be any object that implements the `generic.ResourceObject` interface.
13+
14+
### Building a generic client on a source
15+
16+
Developers can use `generic.NewCloudEventSourceClient` method to build a generic client on the source. To build this
17+
client the developers need to provide
18+
19+
1. A cloudevents source options (`options.CloudEventsSourceOptions`), this options have two parts
20+
- `sourceID`, it is a unique identifier for a source, for example, it can generate a source ID by hashing the hub
21+
cluster URL and appending the controller name. Similarly, a RESTful service can select a unique name or generate a
22+
unique ID in the associated database for its source identification.
23+
- `CloudEventsOptions`, it provides cloudevents clients to send/receive cloudevents based on different event
24+
protocol. We have supported the MQTT protocol (`mqtt.NewSourceOptions`), developers can use it directly.
25+
26+
2. A resource lister (`generic.Lister`), it is used to list the resource objects on the source when resyncing the
27+
resources between sources and agents, for example, a hub controller can list the resources from the resource informers,
28+
and a RESTful service can list its resources from a database.
29+
30+
3. A resource status hash getter method (`generic.StatusHashGetter`), this method will be used to calculate the resource
31+
status hash when resyncing the resource status between sources and agents.
32+
33+
4. Codecs (`generic.Codec`), they are used to encode a resource object into a cloudevent and decode a cloudevent into a
34+
resource object with a given cloudevent data type. We have provided two data types (`io.open-cluster-management.works.v1alpha1.manifests`
35+
that contains a single resource object in the cloudevent payload and `io.open-cluster-management.works.v1alpha1.manifestbundles`
36+
that contains a list of resource objects in the cloudevent payload) for `ManifestWork`, they can be found in the `work/payload`
37+
package.
38+
39+
5. Resource handler methods (`generic.ResourceHandler`), they are used to handle the resources status after the client
40+
received the resources status from agents.
41+
42+
for example:
43+
44+
```golang
45+
// build a client for the source1
46+
client, err := generic.NewCloudEventSourceClient[*CustomerResource](
47+
ctx,
48+
mqtt.NewSourceOptions(mqtt.NewMQTTOptions(), "source1"),
49+
customerResourceLister,
50+
customerResourceStatusHashGetter,
51+
customerResourceCodec,
52+
)
53+
54+
// start a go routine to receive the resources status from agents
55+
go func() {
56+
if err := client.Subscribe(ctx, customerResourceHandler); err != nil {
57+
//TODO handle this error when subscribing the cloudevents failed
58+
}
59+
}()
60+
```
61+
62+
You may refer to the [cloudevents client integration test](../test/integration/cloudevents/source) as an example.
63+
64+
### Building a generic client on a manged cluster
65+
66+
Developers can use `generic.NewCloudEventAgentClient` method to build a generic client on a managed cluster. To build
67+
this client the developers need to provide
68+
69+
1. A cloudevents agent options (`options.CloudEventsAgentOptions`), this options have three parts
70+
- `agentID`, it is a unique identifier for an agent, for example, it can consist of a managed cluster name and an
71+
agent name.
72+
- `clusterName`, it is the name of a managed cluster on which the agent runs.
73+
- `CloudEventsOptions`, it provides cloudevents clients to send/receive cloudevents based on different event
74+
protocol. We have supported the MQTT protocol (`mqtt.NewAgentOptions`), developers can use it directly.
75+
76+
2. A resource lister (`generic.Lister`), it is used to list the resource objects on a managed cluster when resyncing the
77+
resources between sources and agents, for example, a work agent can list its works from its work informers.
78+
79+
3. A resource status hash getter method (`generic.StatusHashGetter`), this method will be used to calculate the resource
80+
status hash when resyncing the resource status between sources and agents.
81+
82+
4. Codecs (`generic.Codec`), they are used to encode a resource object into a cloudevent and decode a cloudevent into a
83+
resource object with a given cloudevent data type. We have provided two data types (`io.open-cluster-management.works.v1alpha1.manifests`
84+
that contains a single resource object in the cloudevent payload and `io.open-cluster-management.works.v1alpha1.manifestbundles`
85+
that contains a list of resource objects in the cloudevent payload) for `ManifestWork`, they can be found in the `work/payload`
86+
package.
87+
88+
5. Resource handler methods (`generic.ResourceHandler`), they are used to handle the resources after the client received
89+
the resources from sources.
90+
91+
for example:
92+
93+
```golang
94+
// build a client for a work agent on the cluster1
95+
client, err := generic.NewCloudEventAgentClient[*CustomerResource](
96+
ctx,
97+
mqtt.NewAgentOptions(mqtt.NewMQTTOptions(), "cluster1", "cluster1-work-agent"),
98+
&ManifestWorkLister{},
99+
ManifestWorkStatusHash,
100+
&ManifestBundleCodec{},
101+
)
102+
103+
// start a go routine to receive the resources from sources
104+
go func() {
105+
if err := client.Subscribe(ctx, NewManifestWorkAgentHandler()); err != nil {
106+
//TODO handle this error when subscribing the cloudevents failed
107+
}
108+
}()
109+
```
110+
111+
## Work Clients
112+
113+
We have provided a builder to build the `ManifestWork` client (`ManifestWorkInterface`) and informer (`ManifestWorkInformer`)
114+
based on the generic client.
115+
116+
### Building work client for work controllers on the hub cluster
117+
118+
TODO
119+
120+
### Building work client for work agent on the managed cluster
121+
122+
Developers can use the builder to build the `ManifestWork` client and informer with the cluster name.
123+
124+
```golang
125+
126+
clusterName := "cluster1"
127+
// Building the clients based on cloudevents with MQTT
128+
config := mqtt.NewMQTTOptions()
129+
130+
clientHolder, err := work.NewClientHolderBuilder(fmt.Sprintf("%s-work-agent", clusterName), config).
131+
WithClusterName(clusterName).
132+
// Supports two event data types for ManifestWork
133+
WithCodecs(codec.NewManifestBundleCodec(), codec.NewManifestCodec(restMapper)).
134+
NewClientHolder(ctx)
135+
if err != nil {
136+
return err
137+
}
138+
139+
manifestWorkClient := clientHolder.ManifestWorks(clusterName)
140+
manifestWorkInformer := clientHolder.ManifestWorkInformer()
141+
142+
// Building controllers with ManifestWork client and informer ...
143+
144+
// Start the ManifestWork informer
145+
go manifestWorkInformer.Informer().Run(ctx.Done())
146+
147+
```

cloudevents/generic/agentclient.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import (
1818
//
1919
// An agent is a component that handles the deployment of requested resources on the managed cluster and status report
2020
// to the source.
21+
//
22+
// TODO support limiting the message sending rate with a configuration.
2123
type CloudEventAgentClient[T ResourceObject] struct {
2224
cloudEventsOptions options.CloudEventsOptions
2325
sender cloudevents.Client

cloudevents/generic/sourceclient.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import (
1919
//
2020
// A source is a component that runs on a server, it can be a controller on the hub cluster or a RESTful service
2121
// handling resource requests.
22+
//
23+
// TODO support limiting the message sending rate with a configuration.
2224
type CloudEventSourceClient[T ResourceObject] struct {
2325
cloudEventsOptions options.CloudEventsOptions
2426
sender cloudevents.Client

go.mod

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ require (
99
github.com/evanphx/json-patch v4.12.0+incompatible
1010
github.com/gogo/protobuf v1.3.2
1111
github.com/google/uuid v1.2.0
12+
github.com/mochi-mqtt/server/v2 v2.3.0
1213
github.com/onsi/ginkgo v1.16.5
1314
github.com/onsi/gomega v1.24.1
1415
github.com/openshift/build-machinery-go v0.0.0-20230306181456-d321ffa04533
@@ -40,10 +41,13 @@ require (
4041
github.com/google/gnostic v0.5.7-v3refs // indirect
4142
github.com/google/go-cmp v0.5.9 // indirect
4243
github.com/google/gofuzz v1.1.0 // indirect
44+
github.com/gorilla/websocket v1.5.0 // indirect
4345
github.com/imdario/mergo v0.3.12 // indirect
4446
github.com/josharian/intern v1.0.0 // indirect
4547
github.com/json-iterator/go v1.1.12 // indirect
4648
github.com/mailru/easyjson v0.7.6 // indirect
49+
github.com/mattn/go-colorable v0.1.12 // indirect
50+
github.com/mattn/go-isatty v0.0.14 // indirect
4751
github.com/matttproud/golang_protobuf_extensions v1.0.2 // indirect
4852
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
4953
github.com/modern-go/reflect2 v1.0.2 // indirect
@@ -55,6 +59,8 @@ require (
5559
github.com/prometheus/client_model v0.3.0 // indirect
5660
github.com/prometheus/common v0.37.0 // indirect
5761
github.com/prometheus/procfs v0.8.0 // indirect
62+
github.com/rs/xid v1.4.0 // indirect
63+
github.com/rs/zerolog v1.28.0 // indirect
5864
go.uber.org/atomic v1.7.0 // indirect
5965
go.uber.org/multierr v1.6.0 // indirect
6066
go.uber.org/zap v1.24.0 // indirect

go.sum

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ github.com/cloudevents/sdk-go/protocol/mqtt_paho/v2 v2.0.0-20230807084042-7f5ef3
5858
github.com/cloudevents/sdk-go/v2 v2.14.0 h1:Nrob4FwVgi5L4tV9lhjzZcjYqFVyJzsA56CwPaPfv6s=
5959
github.com/cloudevents/sdk-go/v2 v2.14.0/go.mod h1:xDmKfzNjM8gBvjaF8ijFjM1VYOVUEeUfapHMUX1T5To=
6060
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
61+
github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
6162
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
6263
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
6364
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
@@ -105,6 +106,7 @@ github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5F
105106
github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
106107
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
107108
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
109+
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
108110
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
109111
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
110112
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
@@ -170,13 +172,16 @@ github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+
170172
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
171173
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
172174
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
175+
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
176+
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
173177
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
174178
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
175179
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
176180
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
177181
github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
178182
github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
179183
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
184+
github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg=
180185
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
181186
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
182187
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
@@ -204,9 +209,15 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN
204209
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
205210
github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=
206211
github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
212+
github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
213+
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
214+
github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
215+
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
207216
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
208217
github.com/matttproud/golang_protobuf_extensions v1.0.2 h1:hAHbPm5IJGijwng3PWk09JkG9WeqChjprR5s9bBZ+OM=
209218
github.com/matttproud/golang_protobuf_extensions v1.0.2/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
219+
github.com/mochi-mqtt/server/v2 v2.3.0 h1:vcFb7X7ANH1Qy2yGHMvp86N9VxjoUkZpr5mkIbfMLfw=
220+
github.com/mochi-mqtt/server/v2 v2.3.0/go.mod h1:47GGVR0/5gbM1DzsI0f1yo25jcR1aaUIgj4dzmP5MNY=
210221
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
211222
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
212223
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -267,6 +278,10 @@ github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1
267278
github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo=
268279
github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=
269280
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
281+
github.com/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY=
282+
github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
283+
github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY=
284+
github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0=
270285
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
271286
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
272287
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
@@ -439,6 +454,8 @@ golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7w
439454
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
440455
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
441456
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
457+
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
458+
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
442459
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
443460
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
444461
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

test/integration-test.mk

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,12 @@ clean-integration-test:
2828

2929
clean: clean-integration-test
3030

31-
test-integration: ensure-kubebuilder-tools
32-
go test -c ./test/integration
33-
./integration.test -ginkgo.slowSpecThreshold=15 -ginkgo.v -ginkgo.failFast
31+
test-api-integration: ensure-kubebuilder-tools
32+
go test -c ./test/integration/api
33+
./api.test -ginkgo.slowSpecThreshold=15 -ginkgo.v -ginkgo.failFast
3434
.PHONY: test-integration
35+
36+
test-cloudevents-integration: ensure-kubebuilder-tools
37+
go test -c ./test/integration/cloudevents
38+
./cloudevents.test -ginkgo.slowSpecThreshold=15 -ginkgo.v -ginkgo.failFast
39+
.PHONY: test-cloudevents-integration

test/integration/addondeploymentconfig_test.go renamed to test/integration/api/addondeploymentconfig_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package integration
1+
package api
22

33
import (
44
"context"

test/integration/clustermanagementaddon_test.go renamed to test/integration/api/clustermanagementaddon_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package integration
1+
package api
22

33
import (
44
"context"

test/integration/clustermanager_test.go renamed to test/integration/api/clustermanager_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package integration
1+
package api
22

33
import (
44
"context"

0 commit comments

Comments
 (0)