From de0f828b5b6da5017addadda97f64239650c6270 Mon Sep 17 00:00:00 2001 From: Canwu Yao Date: Fri, 30 Sep 2022 01:08:02 +0800 Subject: [PATCH] Reserve nodenetwork CRD and tag it deprecated --- .../network.harvesterhci.io_nodenetworks.yaml | 156 ++++++++ .../v1beta1/nodenetwork.go | 114 ++++++ .../v1beta1/zz_generated_deepcopy.go | 170 ++++++++ .../v1beta1/zz_generated_list_types.go | 17 + .../v1beta1/zz_generated_register.go | 3 + pkg/codegen/main.go | 1 + .../fake_network.harvesterhci.io_client.go | 4 + .../v1beta1/fake/fake_nodenetwork.go | 133 +++++++ .../v1beta1/generated_expansion.go | 2 + .../v1beta1/network.harvesterhci.io_client.go | 5 + .../v1beta1/nodenetwork.go | 184 +++++++++ .../v1beta1/interface.go | 4 + .../v1beta1/nodenetwork.go | 376 ++++++++++++++++++ 13 files changed, 1169 insertions(+) create mode 100644 manifests/crds/network.harvesterhci.io_nodenetworks.yaml create mode 100644 pkg/apis/network.harvesterhci.io/v1beta1/nodenetwork.go create mode 100644 pkg/generated/clientset/versioned/typed/network.harvesterhci.io/v1beta1/fake/fake_nodenetwork.go create mode 100644 pkg/generated/clientset/versioned/typed/network.harvesterhci.io/v1beta1/nodenetwork.go create mode 100644 pkg/generated/controllers/network.harvesterhci.io/v1beta1/nodenetwork.go diff --git a/manifests/crds/network.harvesterhci.io_nodenetworks.yaml b/manifests/crds/network.harvesterhci.io_nodenetworks.yaml new file mode 100644 index 00000000..20a85fee --- /dev/null +++ b/manifests/crds/network.harvesterhci.io_nodenetworks.yaml @@ -0,0 +1,156 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + {} + creationTimestamp: null + name: nodenetworks.network.harvesterhci.io +spec: + group: network.harvesterhci.io + names: + kind: NodeNetwork + listKind: NodeNetworkList + plural: nodenetworks + shortNames: + - nn + - nns + singular: nodenetwork + scope: Cluster + versions: + - additionalPrinterColumns: + - jsonPath: .spec.description + name: DESCRIPTION + type: string + - jsonPath: .spec.nodeName + name: NODENAME + type: string + - jsonPath: .spec.type + name: TYPE + type: string + - jsonPath: .spec.nic + name: NetworkInterface + type: string + deprecated: true + name: v1beta1 + schema: + openAPIV3Schema: + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + properties: + description: + type: string + nic: + type: string + nodeName: + type: string + type: + enum: + - vlan + type: string + required: + - nodeName + type: object + status: + properties: + conditions: + items: + properties: + lastTransitionTime: + description: Last time the condition transitioned from one status + to another. + type: string + lastUpdateTime: + description: The last time this condition was updated. + type: string + message: + description: Human-readable message indicating details about + last transition + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, Unknown. + type: string + type: + description: Type of the condition. + type: string + required: + - status + - type + type: object + type: array + networkIDs: + items: + type: integer + type: array + networkLinkStatus: + additionalProperties: + properties: + index: + type: integer + mac: + type: string + masterIndex: + type: integer + name: + type: string + promiscuous: + type: boolean + state: + type: string + type: + type: string + required: + - name + type: object + type: object + nics: + items: + properties: + index: + description: Index of the NIC + type: integer + masterIndex: + description: Index of the NIC's master + type: integer + name: + description: Name of the NIC + type: string + state: + description: State of the NIC, up/down/unknown + type: string + type: + description: Interface type of the NIC + type: string + usedByManagementNetwork: + description: Specify whether used by management network or not + type: boolean + usedByVlanNetwork: + description: Specify whether used by VLAN network or not + type: boolean + required: + - index + - name + - state + - type + type: object + type: array + type: object + type: object + served: true + storage: true + subresources: {} diff --git a/pkg/apis/network.harvesterhci.io/v1beta1/nodenetwork.go b/pkg/apis/network.harvesterhci.io/v1beta1/nodenetwork.go new file mode 100644 index 00000000..f70472ea --- /dev/null +++ b/pkg/apis/network.harvesterhci.io/v1beta1/nodenetwork.go @@ -0,0 +1,114 @@ +package v1beta1 + +import ( + "github.com/rancher/wrangler/pkg/condition" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// NodeNetwork is deprecated from Harvester v1.1.0 and only keep it for upgrade compatibility purpose + +const GroupName = "network.harvesterhci.io" + +// +genclient +// +genclient:nonNamespaced +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// +kubebuilder:resource:shortName=nn;nns,scope=Cluster +// +kubebuilder:deprecatedversion +// +kubebuilder:printcolumn:name="DESCRIPTION",type=string,JSONPath=`.spec.description` +// +kubebuilder:printcolumn:name="NODENAME",type=string,JSONPath=`.spec.nodeName` +// +kubebuilder:printcolumn:name="TYPE",type=string,JSONPath=`.spec.type` +// +kubebuilder:printcolumn:name="NetworkInterface",type=string,JSONPath=`.spec.nic` + +type NodeNetwork struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec NodeNetworkSpec `json:"spec,omitempty"` + Status NodeNetworkStatus `json:"status,omitempty"` +} + +type NodeNetworkSpec struct { + // +optional + Description string `json:"description,omitempty"` + + NodeName string `json:"nodeName"` + + // +kubebuilder:validation:Required + Type NetworkType `json:"type,omitempty"` + + // +optional + NetworkInterface string `json:"nic,omitempty"` +} + +// +kubebuilder:validation:Enum=vlan +type NetworkType string + +const ( + NetworkTypeVLAN NetworkType = "vlan" +) + +type NodeNetworkStatus struct { + // +optional + NetworkIDs []NetworkID `json:"networkIDs,omitempty"` + + // +optional + NetworkLinkStatus map[string]*LinkStatus `json:"networkLinkStatus,omitempty"` + + // +optional + NetworkInterfaces []NetworkInterface `json:"nics,omitempty"` + + // +optional + Conditions []Condition `json:"conditions,omitempty"` +} + +type NetworkInterface struct { + // Index of the NIC + Index int `json:"index"` + // Index of the NIC's master + MasterIndex int `json:"masterIndex,omitempty"` + // Name of the NIC + Name string `json:"name"` + // Interface type of the NIC + Type string `json:"type"` + // State of the NIC, up/down/unknown + State string `json:"state"` + // Specify whether used by management network or not + UsedByMgmtNetwork bool `json:"usedByManagementNetwork,omitempty"` + // Specify whether used by VLAN network or not + UsedByVlanNetwork bool `json:"usedByVlanNetwork,omitempty"` +} + +type NetworkID int + +type NodeNetworkLinkStatus struct { + // +optional + Index int `json:"index,omitempty"` + + // +optional + Type string `json:"type,omitempty"` + + // +optional + MAC string `json:"mac,omitempty"` + + // +optional + Promiscuous bool `json:"promiscuous,omitempty"` + + // +optional + State string `json:"state,omitempty"` + + // +optional + IPV4Address []string `json:"ipv4Address,omitempty"` + + // +optional + MasterIndex int `json:"masterIndex,omitempty"` + + // +optional + Routes []string `json:"routes,omitempty"` + + // +optional + Conditions []Condition `json:"conditions,omitempty"` +} + +var ( + NodeNetworkReady condition.Cond = "Ready" +) diff --git a/pkg/apis/network.harvesterhci.io/v1beta1/zz_generated_deepcopy.go b/pkg/apis/network.harvesterhci.io/v1beta1/zz_generated_deepcopy.go index 909017fb..57ae2fa0 100644 --- a/pkg/apis/network.harvesterhci.io/v1beta1/zz_generated_deepcopy.go +++ b/pkg/apis/network.harvesterhci.io/v1beta1/zz_generated_deepcopy.go @@ -193,6 +193,176 @@ func (in *LocalArea) DeepCopy() *LocalArea { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NetworkInterface) DeepCopyInto(out *NetworkInterface) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkInterface. +func (in *NetworkInterface) DeepCopy() *NetworkInterface { + if in == nil { + return nil + } + out := new(NetworkInterface) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NodeNetwork) DeepCopyInto(out *NodeNetwork) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + out.Spec = in.Spec + in.Status.DeepCopyInto(&out.Status) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeNetwork. +func (in *NodeNetwork) DeepCopy() *NodeNetwork { + if in == nil { + return nil + } + out := new(NodeNetwork) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *NodeNetwork) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NodeNetworkLinkStatus) DeepCopyInto(out *NodeNetworkLinkStatus) { + *out = *in + if in.IPV4Address != nil { + in, out := &in.IPV4Address, &out.IPV4Address + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Routes != nil { + in, out := &in.Routes, &out.Routes + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]Condition, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeNetworkLinkStatus. +func (in *NodeNetworkLinkStatus) DeepCopy() *NodeNetworkLinkStatus { + if in == nil { + return nil + } + out := new(NodeNetworkLinkStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NodeNetworkList) DeepCopyInto(out *NodeNetworkList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]NodeNetwork, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeNetworkList. +func (in *NodeNetworkList) DeepCopy() *NodeNetworkList { + if in == nil { + return nil + } + out := new(NodeNetworkList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *NodeNetworkList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NodeNetworkSpec) DeepCopyInto(out *NodeNetworkSpec) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeNetworkSpec. +func (in *NodeNetworkSpec) DeepCopy() *NodeNetworkSpec { + if in == nil { + return nil + } + out := new(NodeNetworkSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NodeNetworkStatus) DeepCopyInto(out *NodeNetworkStatus) { + *out = *in + if in.NetworkIDs != nil { + in, out := &in.NetworkIDs, &out.NetworkIDs + *out = make([]NetworkID, len(*in)) + copy(*out, *in) + } + if in.NetworkLinkStatus != nil { + in, out := &in.NetworkLinkStatus, &out.NetworkLinkStatus + *out = make(map[string]*LinkStatus, len(*in)) + for key, val := range *in { + var outVal *LinkStatus + if val == nil { + (*out)[key] = nil + } else { + in, out := &val, &outVal + *out = new(LinkStatus) + **out = **in + } + (*out)[key] = outVal + } + } + if in.NetworkInterfaces != nil { + in, out := &in.NetworkInterfaces, &out.NetworkInterfaces + *out = make([]NetworkInterface, len(*in)) + copy(*out, *in) + } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]Condition, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeNetworkStatus. +func (in *NodeNetworkStatus) DeepCopy() *NodeNetworkStatus { + if in == nil { + return nil + } + out := new(NodeNetworkStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Uplink) DeepCopyInto(out *Uplink) { *out = *in diff --git a/pkg/apis/network.harvesterhci.io/v1beta1/zz_generated_list_types.go b/pkg/apis/network.harvesterhci.io/v1beta1/zz_generated_list_types.go index dd353824..d21e782d 100644 --- a/pkg/apis/network.harvesterhci.io/v1beta1/zz_generated_list_types.go +++ b/pkg/apis/network.harvesterhci.io/v1beta1/zz_generated_list_types.go @@ -43,6 +43,23 @@ func NewClusterNetwork(namespace, name string, obj ClusterNetwork) *ClusterNetwo // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +// NodeNetworkList is a list of NodeNetwork resources +type NodeNetworkList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata"` + + Items []NodeNetwork `json:"items"` +} + +func NewNodeNetwork(namespace, name string, obj NodeNetwork) *NodeNetwork { + obj.APIVersion, obj.Kind = SchemeGroupVersion.WithKind("NodeNetwork").ToAPIVersionAndKind() + obj.Name = name + obj.Namespace = namespace + return &obj +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + // VlanConfigList is a list of VlanConfig resources type VlanConfigList struct { metav1.TypeMeta `json:",inline"` diff --git a/pkg/apis/network.harvesterhci.io/v1beta1/zz_generated_register.go b/pkg/apis/network.harvesterhci.io/v1beta1/zz_generated_register.go index d58bbe33..6de863f7 100644 --- a/pkg/apis/network.harvesterhci.io/v1beta1/zz_generated_register.go +++ b/pkg/apis/network.harvesterhci.io/v1beta1/zz_generated_register.go @@ -29,6 +29,7 @@ import ( var ( ClusterNetworkResourceName = "clusternetworks" + NodeNetworkResourceName = "nodenetworks" VlanConfigResourceName = "vlanconfigs" VlanStatusResourceName = "vlanstatuses" ) @@ -56,6 +57,8 @@ func addKnownTypes(scheme *runtime.Scheme) error { scheme.AddKnownTypes(SchemeGroupVersion, &ClusterNetwork{}, &ClusterNetworkList{}, + &NodeNetwork{}, + &NodeNetworkList{}, &VlanConfig{}, &VlanConfigList{}, &VlanStatus{}, diff --git a/pkg/codegen/main.go b/pkg/codegen/main.go index 46eafcb4..ebc6f287 100644 --- a/pkg/codegen/main.go +++ b/pkg/codegen/main.go @@ -18,6 +18,7 @@ func main() { "network.harvesterhci.io": { Types: []interface{}{ networkv1.ClusterNetwork{}, + networkv1.NodeNetwork{}, networkv1.VlanConfig{}, networkv1.VlanStatus{}, }, diff --git a/pkg/generated/clientset/versioned/typed/network.harvesterhci.io/v1beta1/fake/fake_network.harvesterhci.io_client.go b/pkg/generated/clientset/versioned/typed/network.harvesterhci.io/v1beta1/fake/fake_network.harvesterhci.io_client.go index c3ab0dff..208f6ef7 100644 --- a/pkg/generated/clientset/versioned/typed/network.harvesterhci.io/v1beta1/fake/fake_network.harvesterhci.io_client.go +++ b/pkg/generated/clientset/versioned/typed/network.harvesterhci.io/v1beta1/fake/fake_network.harvesterhci.io_client.go @@ -32,6 +32,10 @@ func (c *FakeNetworkV1beta1) ClusterNetworks() v1beta1.ClusterNetworkInterface { return &FakeClusterNetworks{c} } +func (c *FakeNetworkV1beta1) NodeNetworks() v1beta1.NodeNetworkInterface { + return &FakeNodeNetworks{c} +} + func (c *FakeNetworkV1beta1) VlanConfigs() v1beta1.VlanConfigInterface { return &FakeVlanConfigs{c} } diff --git a/pkg/generated/clientset/versioned/typed/network.harvesterhci.io/v1beta1/fake/fake_nodenetwork.go b/pkg/generated/clientset/versioned/typed/network.harvesterhci.io/v1beta1/fake/fake_nodenetwork.go new file mode 100644 index 00000000..c9dc028b --- /dev/null +++ b/pkg/generated/clientset/versioned/typed/network.harvesterhci.io/v1beta1/fake/fake_nodenetwork.go @@ -0,0 +1,133 @@ +/* +Copyright 2019 Harvester Network Controller Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by main. DO NOT EDIT. + +package fake + +import ( + "context" + + v1beta1 "github.com/harvester/harvester-network-controller/pkg/apis/network.harvesterhci.io/v1beta1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + labels "k8s.io/apimachinery/pkg/labels" + schema "k8s.io/apimachinery/pkg/runtime/schema" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + testing "k8s.io/client-go/testing" +) + +// FakeNodeNetworks implements NodeNetworkInterface +type FakeNodeNetworks struct { + Fake *FakeNetworkV1beta1 +} + +var nodenetworksResource = schema.GroupVersionResource{Group: "network.harvesterhci.io", Version: "v1beta1", Resource: "nodenetworks"} + +var nodenetworksKind = schema.GroupVersionKind{Group: "network.harvesterhci.io", Version: "v1beta1", Kind: "NodeNetwork"} + +// Get takes name of the nodeNetwork, and returns the corresponding nodeNetwork object, and an error if there is any. +func (c *FakeNodeNetworks) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1beta1.NodeNetwork, err error) { + obj, err := c.Fake. + Invokes(testing.NewRootGetAction(nodenetworksResource, name), &v1beta1.NodeNetwork{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.NodeNetwork), err +} + +// List takes label and field selectors, and returns the list of NodeNetworks that match those selectors. +func (c *FakeNodeNetworks) List(ctx context.Context, opts v1.ListOptions) (result *v1beta1.NodeNetworkList, err error) { + obj, err := c.Fake. + Invokes(testing.NewRootListAction(nodenetworksResource, nodenetworksKind, opts), &v1beta1.NodeNetworkList{}) + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &v1beta1.NodeNetworkList{ListMeta: obj.(*v1beta1.NodeNetworkList).ListMeta} + for _, item := range obj.(*v1beta1.NodeNetworkList).Items { + if label.Matches(labels.Set(item.Labels)) { + list.Items = append(list.Items, item) + } + } + return list, err +} + +// Watch returns a watch.Interface that watches the requested nodeNetworks. +func (c *FakeNodeNetworks) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewRootWatchAction(nodenetworksResource, opts)) +} + +// Create takes the representation of a nodeNetwork and creates it. Returns the server's representation of the nodeNetwork, and an error, if there is any. +func (c *FakeNodeNetworks) Create(ctx context.Context, nodeNetwork *v1beta1.NodeNetwork, opts v1.CreateOptions) (result *v1beta1.NodeNetwork, err error) { + obj, err := c.Fake. + Invokes(testing.NewRootCreateAction(nodenetworksResource, nodeNetwork), &v1beta1.NodeNetwork{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.NodeNetwork), err +} + +// Update takes the representation of a nodeNetwork and updates it. Returns the server's representation of the nodeNetwork, and an error, if there is any. +func (c *FakeNodeNetworks) Update(ctx context.Context, nodeNetwork *v1beta1.NodeNetwork, opts v1.UpdateOptions) (result *v1beta1.NodeNetwork, err error) { + obj, err := c.Fake. + Invokes(testing.NewRootUpdateAction(nodenetworksResource, nodeNetwork), &v1beta1.NodeNetwork{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.NodeNetwork), err +} + +// UpdateStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). +func (c *FakeNodeNetworks) UpdateStatus(ctx context.Context, nodeNetwork *v1beta1.NodeNetwork, opts v1.UpdateOptions) (*v1beta1.NodeNetwork, error) { + obj, err := c.Fake. + Invokes(testing.NewRootUpdateSubresourceAction(nodenetworksResource, "status", nodeNetwork), &v1beta1.NodeNetwork{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.NodeNetwork), err +} + +// Delete takes name of the nodeNetwork and deletes it. Returns an error if one occurs. +func (c *FakeNodeNetworks) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewRootDeleteActionWithOptions(nodenetworksResource, name, opts), &v1beta1.NodeNetwork{}) + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakeNodeNetworks) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { + action := testing.NewRootDeleteCollectionAction(nodenetworksResource, listOpts) + + _, err := c.Fake.Invokes(action, &v1beta1.NodeNetworkList{}) + return err +} + +// Patch applies the patch and returns the patched nodeNetwork. +func (c *FakeNodeNetworks) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.NodeNetwork, err error) { + obj, err := c.Fake. + Invokes(testing.NewRootPatchSubresourceAction(nodenetworksResource, name, pt, data, subresources...), &v1beta1.NodeNetwork{}) + if obj == nil { + return nil, err + } + return obj.(*v1beta1.NodeNetwork), err +} diff --git a/pkg/generated/clientset/versioned/typed/network.harvesterhci.io/v1beta1/generated_expansion.go b/pkg/generated/clientset/versioned/typed/network.harvesterhci.io/v1beta1/generated_expansion.go index 40901e0e..9ae3fdc9 100644 --- a/pkg/generated/clientset/versioned/typed/network.harvesterhci.io/v1beta1/generated_expansion.go +++ b/pkg/generated/clientset/versioned/typed/network.harvesterhci.io/v1beta1/generated_expansion.go @@ -20,6 +20,8 @@ package v1beta1 type ClusterNetworkExpansion interface{} +type NodeNetworkExpansion interface{} + type VlanConfigExpansion interface{} type VlanStatusExpansion interface{} diff --git a/pkg/generated/clientset/versioned/typed/network.harvesterhci.io/v1beta1/network.harvesterhci.io_client.go b/pkg/generated/clientset/versioned/typed/network.harvesterhci.io/v1beta1/network.harvesterhci.io_client.go index 372729dd..b2b16739 100644 --- a/pkg/generated/clientset/versioned/typed/network.harvesterhci.io/v1beta1/network.harvesterhci.io_client.go +++ b/pkg/generated/clientset/versioned/typed/network.harvesterhci.io/v1beta1/network.harvesterhci.io_client.go @@ -29,6 +29,7 @@ import ( type NetworkV1beta1Interface interface { RESTClient() rest.Interface ClusterNetworksGetter + NodeNetworksGetter VlanConfigsGetter VlanStatusesGetter } @@ -42,6 +43,10 @@ func (c *NetworkV1beta1Client) ClusterNetworks() ClusterNetworkInterface { return newClusterNetworks(c) } +func (c *NetworkV1beta1Client) NodeNetworks() NodeNetworkInterface { + return newNodeNetworks(c) +} + func (c *NetworkV1beta1Client) VlanConfigs() VlanConfigInterface { return newVlanConfigs(c) } diff --git a/pkg/generated/clientset/versioned/typed/network.harvesterhci.io/v1beta1/nodenetwork.go b/pkg/generated/clientset/versioned/typed/network.harvesterhci.io/v1beta1/nodenetwork.go new file mode 100644 index 00000000..e5c8797c --- /dev/null +++ b/pkg/generated/clientset/versioned/typed/network.harvesterhci.io/v1beta1/nodenetwork.go @@ -0,0 +1,184 @@ +/* +Copyright 2019 Harvester Network Controller Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by main. DO NOT EDIT. + +package v1beta1 + +import ( + "context" + "time" + + v1beta1 "github.com/harvester/harvester-network-controller/pkg/apis/network.harvesterhci.io/v1beta1" + scheme "github.com/harvester/harvester-network-controller/pkg/generated/clientset/versioned/scheme" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + rest "k8s.io/client-go/rest" +) + +// NodeNetworksGetter has a method to return a NodeNetworkInterface. +// A group's client should implement this interface. +type NodeNetworksGetter interface { + NodeNetworks() NodeNetworkInterface +} + +// NodeNetworkInterface has methods to work with NodeNetwork resources. +type NodeNetworkInterface interface { + Create(ctx context.Context, nodeNetwork *v1beta1.NodeNetwork, opts v1.CreateOptions) (*v1beta1.NodeNetwork, error) + Update(ctx context.Context, nodeNetwork *v1beta1.NodeNetwork, opts v1.UpdateOptions) (*v1beta1.NodeNetwork, error) + UpdateStatus(ctx context.Context, nodeNetwork *v1beta1.NodeNetwork, opts v1.UpdateOptions) (*v1beta1.NodeNetwork, error) + Delete(ctx context.Context, name string, opts v1.DeleteOptions) error + DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error + Get(ctx context.Context, name string, opts v1.GetOptions) (*v1beta1.NodeNetwork, error) + List(ctx context.Context, opts v1.ListOptions) (*v1beta1.NodeNetworkList, error) + Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) + Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.NodeNetwork, err error) + NodeNetworkExpansion +} + +// nodeNetworks implements NodeNetworkInterface +type nodeNetworks struct { + client rest.Interface +} + +// newNodeNetworks returns a NodeNetworks +func newNodeNetworks(c *NetworkV1beta1Client) *nodeNetworks { + return &nodeNetworks{ + client: c.RESTClient(), + } +} + +// Get takes name of the nodeNetwork, and returns the corresponding nodeNetwork object, and an error if there is any. +func (c *nodeNetworks) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1beta1.NodeNetwork, err error) { + result = &v1beta1.NodeNetwork{} + err = c.client.Get(). + Resource("nodenetworks"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(ctx). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of NodeNetworks that match those selectors. +func (c *nodeNetworks) List(ctx context.Context, opts v1.ListOptions) (result *v1beta1.NodeNetworkList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v1beta1.NodeNetworkList{} + err = c.client.Get(). + Resource("nodenetworks"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(ctx). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested nodeNetworks. +func (c *nodeNetworks) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + opts.Watch = true + return c.client.Get(). + Resource("nodenetworks"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch(ctx) +} + +// Create takes the representation of a nodeNetwork and creates it. Returns the server's representation of the nodeNetwork, and an error, if there is any. +func (c *nodeNetworks) Create(ctx context.Context, nodeNetwork *v1beta1.NodeNetwork, opts v1.CreateOptions) (result *v1beta1.NodeNetwork, err error) { + result = &v1beta1.NodeNetwork{} + err = c.client.Post(). + Resource("nodenetworks"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(nodeNetwork). + Do(ctx). + Into(result) + return +} + +// Update takes the representation of a nodeNetwork and updates it. Returns the server's representation of the nodeNetwork, and an error, if there is any. +func (c *nodeNetworks) Update(ctx context.Context, nodeNetwork *v1beta1.NodeNetwork, opts v1.UpdateOptions) (result *v1beta1.NodeNetwork, err error) { + result = &v1beta1.NodeNetwork{} + err = c.client.Put(). + Resource("nodenetworks"). + Name(nodeNetwork.Name). + VersionedParams(&opts, scheme.ParameterCodec). + Body(nodeNetwork). + Do(ctx). + Into(result) + return +} + +// UpdateStatus was generated because the type contains a Status member. +// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus(). +func (c *nodeNetworks) UpdateStatus(ctx context.Context, nodeNetwork *v1beta1.NodeNetwork, opts v1.UpdateOptions) (result *v1beta1.NodeNetwork, err error) { + result = &v1beta1.NodeNetwork{} + err = c.client.Put(). + Resource("nodenetworks"). + Name(nodeNetwork.Name). + SubResource("status"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(nodeNetwork). + Do(ctx). + Into(result) + return +} + +// Delete takes name of the nodeNetwork and deletes it. Returns an error if one occurs. +func (c *nodeNetworks) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { + return c.client.Delete(). + Resource("nodenetworks"). + Name(name). + Body(&opts). + Do(ctx). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *nodeNetworks) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { + var timeout time.Duration + if listOpts.TimeoutSeconds != nil { + timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second + } + return c.client.Delete(). + Resource("nodenetworks"). + VersionedParams(&listOpts, scheme.ParameterCodec). + Timeout(timeout). + Body(&opts). + Do(ctx). + Error() +} + +// Patch applies the patch and returns the patched nodeNetwork. +func (c *nodeNetworks) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1beta1.NodeNetwork, err error) { + result = &v1beta1.NodeNetwork{} + err = c.client.Patch(pt). + Resource("nodenetworks"). + Name(name). + SubResource(subresources...). + VersionedParams(&opts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/pkg/generated/controllers/network.harvesterhci.io/v1beta1/interface.go b/pkg/generated/controllers/network.harvesterhci.io/v1beta1/interface.go index ff9c28f9..a10c9d6f 100644 --- a/pkg/generated/controllers/network.harvesterhci.io/v1beta1/interface.go +++ b/pkg/generated/controllers/network.harvesterhci.io/v1beta1/interface.go @@ -31,6 +31,7 @@ func init() { type Interface interface { ClusterNetwork() ClusterNetworkController + NodeNetwork() NodeNetworkController VlanConfig() VlanConfigController VlanStatus() VlanStatusController } @@ -48,6 +49,9 @@ type version struct { func (c *version) ClusterNetwork() ClusterNetworkController { return NewClusterNetworkController(schema.GroupVersionKind{Group: "network.harvesterhci.io", Version: "v1beta1", Kind: "ClusterNetwork"}, "clusternetworks", false, c.controllerFactory) } +func (c *version) NodeNetwork() NodeNetworkController { + return NewNodeNetworkController(schema.GroupVersionKind{Group: "network.harvesterhci.io", Version: "v1beta1", Kind: "NodeNetwork"}, "nodenetworks", false, c.controllerFactory) +} func (c *version) VlanConfig() VlanConfigController { return NewVlanConfigController(schema.GroupVersionKind{Group: "network.harvesterhci.io", Version: "v1beta1", Kind: "VlanConfig"}, "vlanconfigs", false, c.controllerFactory) } diff --git a/pkg/generated/controllers/network.harvesterhci.io/v1beta1/nodenetwork.go b/pkg/generated/controllers/network.harvesterhci.io/v1beta1/nodenetwork.go new file mode 100644 index 00000000..fc83cb54 --- /dev/null +++ b/pkg/generated/controllers/network.harvesterhci.io/v1beta1/nodenetwork.go @@ -0,0 +1,376 @@ +/* +Copyright 2019 Harvester Network Controller Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by main. DO NOT EDIT. + +package v1beta1 + +import ( + "context" + "time" + + v1beta1 "github.com/harvester/harvester-network-controller/pkg/apis/network.harvesterhci.io/v1beta1" + "github.com/rancher/lasso/pkg/client" + "github.com/rancher/lasso/pkg/controller" + "github.com/rancher/wrangler/pkg/apply" + "github.com/rancher/wrangler/pkg/condition" + "github.com/rancher/wrangler/pkg/generic" + "github.com/rancher/wrangler/pkg/kv" + "k8s.io/apimachinery/pkg/api/equality" + "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/apimachinery/pkg/watch" + "k8s.io/client-go/tools/cache" +) + +type NodeNetworkHandler func(string, *v1beta1.NodeNetwork) (*v1beta1.NodeNetwork, error) + +type NodeNetworkController interface { + generic.ControllerMeta + NodeNetworkClient + + OnChange(ctx context.Context, name string, sync NodeNetworkHandler) + OnRemove(ctx context.Context, name string, sync NodeNetworkHandler) + Enqueue(name string) + EnqueueAfter(name string, duration time.Duration) + + Cache() NodeNetworkCache +} + +type NodeNetworkClient interface { + Create(*v1beta1.NodeNetwork) (*v1beta1.NodeNetwork, error) + Update(*v1beta1.NodeNetwork) (*v1beta1.NodeNetwork, error) + UpdateStatus(*v1beta1.NodeNetwork) (*v1beta1.NodeNetwork, error) + Delete(name string, options *metav1.DeleteOptions) error + Get(name string, options metav1.GetOptions) (*v1beta1.NodeNetwork, error) + List(opts metav1.ListOptions) (*v1beta1.NodeNetworkList, error) + Watch(opts metav1.ListOptions) (watch.Interface, error) + Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1beta1.NodeNetwork, err error) +} + +type NodeNetworkCache interface { + Get(name string) (*v1beta1.NodeNetwork, error) + List(selector labels.Selector) ([]*v1beta1.NodeNetwork, error) + + AddIndexer(indexName string, indexer NodeNetworkIndexer) + GetByIndex(indexName, key string) ([]*v1beta1.NodeNetwork, error) +} + +type NodeNetworkIndexer func(obj *v1beta1.NodeNetwork) ([]string, error) + +type nodeNetworkController struct { + controller controller.SharedController + client *client.Client + gvk schema.GroupVersionKind + groupResource schema.GroupResource +} + +func NewNodeNetworkController(gvk schema.GroupVersionKind, resource string, namespaced bool, controller controller.SharedControllerFactory) NodeNetworkController { + c := controller.ForResourceKind(gvk.GroupVersion().WithResource(resource), gvk.Kind, namespaced) + return &nodeNetworkController{ + controller: c, + client: c.Client(), + gvk: gvk, + groupResource: schema.GroupResource{ + Group: gvk.Group, + Resource: resource, + }, + } +} + +func FromNodeNetworkHandlerToHandler(sync NodeNetworkHandler) generic.Handler { + return func(key string, obj runtime.Object) (ret runtime.Object, err error) { + var v *v1beta1.NodeNetwork + if obj == nil { + v, err = sync(key, nil) + } else { + v, err = sync(key, obj.(*v1beta1.NodeNetwork)) + } + if v == nil { + return nil, err + } + return v, err + } +} + +func (c *nodeNetworkController) Updater() generic.Updater { + return func(obj runtime.Object) (runtime.Object, error) { + newObj, err := c.Update(obj.(*v1beta1.NodeNetwork)) + if newObj == nil { + return nil, err + } + return newObj, err + } +} + +func UpdateNodeNetworkDeepCopyOnChange(client NodeNetworkClient, obj *v1beta1.NodeNetwork, handler func(obj *v1beta1.NodeNetwork) (*v1beta1.NodeNetwork, error)) (*v1beta1.NodeNetwork, error) { + if obj == nil { + return obj, nil + } + + copyObj := obj.DeepCopy() + newObj, err := handler(copyObj) + if newObj != nil { + copyObj = newObj + } + if obj.ResourceVersion == copyObj.ResourceVersion && !equality.Semantic.DeepEqual(obj, copyObj) { + return client.Update(copyObj) + } + + return copyObj, err +} + +func (c *nodeNetworkController) AddGenericHandler(ctx context.Context, name string, handler generic.Handler) { + c.controller.RegisterHandler(ctx, name, controller.SharedControllerHandlerFunc(handler)) +} + +func (c *nodeNetworkController) AddGenericRemoveHandler(ctx context.Context, name string, handler generic.Handler) { + c.AddGenericHandler(ctx, name, generic.NewRemoveHandler(name, c.Updater(), handler)) +} + +func (c *nodeNetworkController) OnChange(ctx context.Context, name string, sync NodeNetworkHandler) { + c.AddGenericHandler(ctx, name, FromNodeNetworkHandlerToHandler(sync)) +} + +func (c *nodeNetworkController) OnRemove(ctx context.Context, name string, sync NodeNetworkHandler) { + c.AddGenericHandler(ctx, name, generic.NewRemoveHandler(name, c.Updater(), FromNodeNetworkHandlerToHandler(sync))) +} + +func (c *nodeNetworkController) Enqueue(name string) { + c.controller.Enqueue("", name) +} + +func (c *nodeNetworkController) EnqueueAfter(name string, duration time.Duration) { + c.controller.EnqueueAfter("", name, duration) +} + +func (c *nodeNetworkController) Informer() cache.SharedIndexInformer { + return c.controller.Informer() +} + +func (c *nodeNetworkController) GroupVersionKind() schema.GroupVersionKind { + return c.gvk +} + +func (c *nodeNetworkController) Cache() NodeNetworkCache { + return &nodeNetworkCache{ + indexer: c.Informer().GetIndexer(), + resource: c.groupResource, + } +} + +func (c *nodeNetworkController) Create(obj *v1beta1.NodeNetwork) (*v1beta1.NodeNetwork, error) { + result := &v1beta1.NodeNetwork{} + return result, c.client.Create(context.TODO(), "", obj, result, metav1.CreateOptions{}) +} + +func (c *nodeNetworkController) Update(obj *v1beta1.NodeNetwork) (*v1beta1.NodeNetwork, error) { + result := &v1beta1.NodeNetwork{} + return result, c.client.Update(context.TODO(), "", obj, result, metav1.UpdateOptions{}) +} + +func (c *nodeNetworkController) UpdateStatus(obj *v1beta1.NodeNetwork) (*v1beta1.NodeNetwork, error) { + result := &v1beta1.NodeNetwork{} + return result, c.client.UpdateStatus(context.TODO(), "", obj, result, metav1.UpdateOptions{}) +} + +func (c *nodeNetworkController) Delete(name string, options *metav1.DeleteOptions) error { + if options == nil { + options = &metav1.DeleteOptions{} + } + return c.client.Delete(context.TODO(), "", name, *options) +} + +func (c *nodeNetworkController) Get(name string, options metav1.GetOptions) (*v1beta1.NodeNetwork, error) { + result := &v1beta1.NodeNetwork{} + return result, c.client.Get(context.TODO(), "", name, result, options) +} + +func (c *nodeNetworkController) List(opts metav1.ListOptions) (*v1beta1.NodeNetworkList, error) { + result := &v1beta1.NodeNetworkList{} + return result, c.client.List(context.TODO(), "", result, opts) +} + +func (c *nodeNetworkController) Watch(opts metav1.ListOptions) (watch.Interface, error) { + return c.client.Watch(context.TODO(), "", opts) +} + +func (c *nodeNetworkController) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (*v1beta1.NodeNetwork, error) { + result := &v1beta1.NodeNetwork{} + return result, c.client.Patch(context.TODO(), "", name, pt, data, result, metav1.PatchOptions{}, subresources...) +} + +type nodeNetworkCache struct { + indexer cache.Indexer + resource schema.GroupResource +} + +func (c *nodeNetworkCache) Get(name string) (*v1beta1.NodeNetwork, error) { + obj, exists, err := c.indexer.GetByKey(name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(c.resource, name) + } + return obj.(*v1beta1.NodeNetwork), nil +} + +func (c *nodeNetworkCache) List(selector labels.Selector) (ret []*v1beta1.NodeNetwork, err error) { + + err = cache.ListAll(c.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1beta1.NodeNetwork)) + }) + + return ret, err +} + +func (c *nodeNetworkCache) AddIndexer(indexName string, indexer NodeNetworkIndexer) { + utilruntime.Must(c.indexer.AddIndexers(map[string]cache.IndexFunc{ + indexName: func(obj interface{}) (strings []string, e error) { + return indexer(obj.(*v1beta1.NodeNetwork)) + }, + })) +} + +func (c *nodeNetworkCache) GetByIndex(indexName, key string) (result []*v1beta1.NodeNetwork, err error) { + objs, err := c.indexer.ByIndex(indexName, key) + if err != nil { + return nil, err + } + result = make([]*v1beta1.NodeNetwork, 0, len(objs)) + for _, obj := range objs { + result = append(result, obj.(*v1beta1.NodeNetwork)) + } + return result, nil +} + +type NodeNetworkStatusHandler func(obj *v1beta1.NodeNetwork, status v1beta1.NodeNetworkStatus) (v1beta1.NodeNetworkStatus, error) + +type NodeNetworkGeneratingHandler func(obj *v1beta1.NodeNetwork, status v1beta1.NodeNetworkStatus) ([]runtime.Object, v1beta1.NodeNetworkStatus, error) + +func RegisterNodeNetworkStatusHandler(ctx context.Context, controller NodeNetworkController, condition condition.Cond, name string, handler NodeNetworkStatusHandler) { + statusHandler := &nodeNetworkStatusHandler{ + client: controller, + condition: condition, + handler: handler, + } + controller.AddGenericHandler(ctx, name, FromNodeNetworkHandlerToHandler(statusHandler.sync)) +} + +func RegisterNodeNetworkGeneratingHandler(ctx context.Context, controller NodeNetworkController, apply apply.Apply, + condition condition.Cond, name string, handler NodeNetworkGeneratingHandler, opts *generic.GeneratingHandlerOptions) { + statusHandler := &nodeNetworkGeneratingHandler{ + NodeNetworkGeneratingHandler: handler, + apply: apply, + name: name, + gvk: controller.GroupVersionKind(), + } + if opts != nil { + statusHandler.opts = *opts + } + controller.OnChange(ctx, name, statusHandler.Remove) + RegisterNodeNetworkStatusHandler(ctx, controller, condition, name, statusHandler.Handle) +} + +type nodeNetworkStatusHandler struct { + client NodeNetworkClient + condition condition.Cond + handler NodeNetworkStatusHandler +} + +func (a *nodeNetworkStatusHandler) sync(key string, obj *v1beta1.NodeNetwork) (*v1beta1.NodeNetwork, error) { + if obj == nil { + return obj, nil + } + + origStatus := obj.Status.DeepCopy() + obj = obj.DeepCopy() + newStatus, err := a.handler(obj, obj.Status) + if err != nil { + // Revert to old status on error + newStatus = *origStatus.DeepCopy() + } + + if a.condition != "" { + if errors.IsConflict(err) { + a.condition.SetError(&newStatus, "", nil) + } else { + a.condition.SetError(&newStatus, "", err) + } + } + if !equality.Semantic.DeepEqual(origStatus, &newStatus) { + if a.condition != "" { + // Since status has changed, update the lastUpdatedTime + a.condition.LastUpdated(&newStatus, time.Now().UTC().Format(time.RFC3339)) + } + + var newErr error + obj.Status = newStatus + newObj, newErr := a.client.UpdateStatus(obj) + if err == nil { + err = newErr + } + if newErr == nil { + obj = newObj + } + } + return obj, err +} + +type nodeNetworkGeneratingHandler struct { + NodeNetworkGeneratingHandler + apply apply.Apply + opts generic.GeneratingHandlerOptions + gvk schema.GroupVersionKind + name string +} + +func (a *nodeNetworkGeneratingHandler) Remove(key string, obj *v1beta1.NodeNetwork) (*v1beta1.NodeNetwork, error) { + if obj != nil { + return obj, nil + } + + obj = &v1beta1.NodeNetwork{} + obj.Namespace, obj.Name = kv.RSplit(key, "/") + obj.SetGroupVersionKind(a.gvk) + + return nil, generic.ConfigureApplyForObject(a.apply, obj, &a.opts). + WithOwner(obj). + WithSetID(a.name). + ApplyObjects() +} + +func (a *nodeNetworkGeneratingHandler) Handle(obj *v1beta1.NodeNetwork, status v1beta1.NodeNetworkStatus) (v1beta1.NodeNetworkStatus, error) { + if !obj.DeletionTimestamp.IsZero() { + return status, nil + } + + objs, newStatus, err := a.NodeNetworkGeneratingHandler(obj, status) + if err != nil { + return newStatus, err + } + + return newStatus, generic.ConfigureApplyForObject(a.apply, obj, &a.opts). + WithOwner(obj). + WithSetID(a.name). + ApplyObjects(objs...) +}