1
0
mirror of https://github.com/openshift/installer.git synced 2026-02-05 15:47:14 +01:00

Add generated DeepCopy implementations for pkg/types/installconfig

This commit is contained in:
Mark Old
2025-10-21 17:04:35 -07:00
parent 1dacae5d2d
commit 8ccbf40fff
67 changed files with 9459 additions and 1 deletions

2
go.mod
View File

@@ -132,6 +132,7 @@ require (
k8s.io/apimachinery v0.34.1
k8s.io/client-go v0.34.1
k8s.io/cloud-provider-vsphere v1.31.0
k8s.io/code-generator v0.34.1
k8s.io/klog v1.0.0
k8s.io/klog/v2 v2.130.1
k8s.io/utils v0.0.0-20250820121507-0af2bda4dd1d
@@ -347,6 +348,7 @@ require (
k8s.io/cli-runtime v0.33.4 // indirect
k8s.io/cluster-bootstrap v0.33.3 // indirect
k8s.io/component-base v0.34.1 // indirect
k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f // indirect
k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b // indirect
k8s.io/kubectl v0.33.4 // indirect
sigs.k8s.io/kustomize/api v0.19.0 // indirect

4
go.sum
View File

@@ -1172,10 +1172,14 @@ k8s.io/client-go v0.34.1/go.mod h1:kA8v0FP+tk6sZA0yKLRG67LWjqufAoSHA2xVGKw9Of8=
k8s.io/cluster-bootstrap v0.33.3 h1:u2NTxJ5CFSBFXaDxLQoOWMly8eni31psVso+caq6uwI=
k8s.io/cluster-bootstrap v0.33.3/go.mod h1:p970f8u8jf273zyQ5raD8WUu2XyAl0SAWOY82o7i/ds=
k8s.io/code-generator v0.23.3/go.mod h1:S0Q1JVA+kSzTI1oUvbKAxZY/DYbA/ZUb4Uknog12ETk=
k8s.io/code-generator v0.34.1 h1:WpphT26E+j7tEgIUfFr5WfbJrktCGzB3JoJH9149xYc=
k8s.io/code-generator v0.34.1/go.mod h1:DeWjekbDnJWRwpw3s0Jat87c+e0TgkxoR4ar608yqvg=
k8s.io/component-base v0.34.1 h1:v7xFgG+ONhytZNFpIz5/kecwD+sUhVE6HU7qQUiRM4A=
k8s.io/component-base v0.34.1/go.mod h1:mknCpLlTSKHzAQJJnnHVKqjxR7gBeHRv0rPXA7gdtQ0=
k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f h1:SLb+kxmzfA87x4E4brQzB33VBbT2+x7Zq9ROIHmGn9Q=
k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU=
k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=
k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=

View File

@@ -95,3 +95,22 @@ func MustParseCIDR(s string) *IPNet {
}
return cidr
}
// DeepCopyInto copies the receiver into out. out must be non-nil.
func (ipnet *IPNet) DeepCopyInto(out *IPNet) {
if ipnet == nil {
*out = IPNet{}
} else {
*out = *ipnet
}
}
// DeepCopy copies the receiver, creating a new IPNet.
func (ipnet *IPNet) DeepCopy() *IPNet {
if ipnet == nil {
return nil
}
out := new(IPNet)
ipnet.DeepCopyInto(out)
return out
}

View File

@@ -56,3 +56,36 @@ func TestUnmarshal(t *testing.T) {
})
}
}
func TestDeepCopy(t *testing.T) {
for _, ipNetIn := range []*IPNet{
{},
{IPNet: net.IPNet{
IP: net.IP{192, 168, 0, 10},
Mask: net.IPv4Mask(255, 255, 255, 0),
}},
} {
t.Run(ipNetIn.String(), func(t *testing.T) {
t.Run("DeepCopyInto", func(t *testing.T) {
ipNetOut := &IPNet{}
ipNetIn.DeepCopyInto(ipNetOut)
if ipNetOut.String() != ipNetIn.String() {
t.Fatalf("%v != %v", ipNetOut, ipNetIn)
}
if ipNetOut == ipNetIn {
t.Fatalf("DeepCopyInto did not deep copy (pointers are equal)")
}
})
t.Run("DeepCopy", func(t *testing.T) {
ipNetOut := ipNetIn.DeepCopy()
if ipNetOut.String() != ipNetIn.String() {
t.Fatalf("%v != %v", ipNetOut, ipNetIn)
}
if ipNetOut == ipNetIn {
t.Fatalf("DeepCopy did not deep copy (pointers are equal)")
}
})
})
}
}

View File

@@ -1,5 +1,6 @@
// Package aws contains AWS-specific structures for installer
// configuration and management.
// +k8s:deepcopy-gen=package
package aws
// Name is name for the AWS platform.

View File

@@ -0,0 +1,215 @@
//go:build !ignore_autogenerated
// +build !ignore_autogenerated
// Code generated by deepcopy-gen. DO NOT EDIT.
package aws
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *EC2Metadata) DeepCopyInto(out *EC2Metadata) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EC2Metadata.
func (in *EC2Metadata) DeepCopy() *EC2Metadata {
if in == nil {
return nil
}
out := new(EC2Metadata)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *EC2RootVolume) DeepCopyInto(out *EC2RootVolume) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EC2RootVolume.
func (in *EC2RootVolume) DeepCopy() *EC2RootVolume {
if in == nil {
return nil
}
out := new(EC2RootVolume)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *MachinePool) DeepCopyInto(out *MachinePool) {
*out = *in
if in.Zones != nil {
in, out := &in.Zones, &out.Zones
*out = make([]string, len(*in))
copy(*out, *in)
}
out.EC2RootVolume = in.EC2RootVolume
out.EC2Metadata = in.EC2Metadata
if in.AdditionalSecurityGroupIDs != nil {
in, out := &in.AdditionalSecurityGroupIDs, &out.AdditionalSecurityGroupIDs
*out = make([]string, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachinePool.
func (in *MachinePool) DeepCopy() *MachinePool {
if in == nil {
return nil
}
out := new(MachinePool)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Metadata) DeepCopyInto(out *Metadata) {
*out = *in
if in.ServiceEndpoints != nil {
in, out := &in.ServiceEndpoints, &out.ServiceEndpoints
*out = make([]ServiceEndpoint, len(*in))
copy(*out, *in)
}
if in.Identifier != nil {
in, out := &in.Identifier, &out.Identifier
*out = make([]map[string]string, len(*in))
for i := range *in {
if (*in)[i] != nil {
in, out := &(*in)[i], &(*out)[i]
*out = make(map[string]string, len(*in))
for key, val := range *in {
(*out)[key] = val
}
}
}
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Metadata.
func (in *Metadata) DeepCopy() *Metadata {
if in == nil {
return nil
}
out := new(Metadata)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Platform) DeepCopyInto(out *Platform) {
*out = *in
if in.DeprecatedSubnets != nil {
in, out := &in.DeprecatedSubnets, &out.DeprecatedSubnets
*out = make([]string, len(*in))
copy(*out, *in)
}
in.VPC.DeepCopyInto(&out.VPC)
if in.UserTags != nil {
in, out := &in.UserTags, &out.UserTags
*out = make(map[string]string, len(*in))
for key, val := range *in {
(*out)[key] = val
}
}
if in.ServiceEndpoints != nil {
in, out := &in.ServiceEndpoints, &out.ServiceEndpoints
*out = make([]ServiceEndpoint, len(*in))
copy(*out, *in)
}
if in.DefaultMachinePlatform != nil {
in, out := &in.DefaultMachinePlatform, &out.DefaultMachinePlatform
*out = new(MachinePool)
(*in).DeepCopyInto(*out)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Platform.
func (in *Platform) DeepCopy() *Platform {
if in == nil {
return nil
}
out := new(Platform)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ServiceEndpoint) DeepCopyInto(out *ServiceEndpoint) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceEndpoint.
func (in *ServiceEndpoint) DeepCopy() *ServiceEndpoint {
if in == nil {
return nil
}
out := new(ServiceEndpoint)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Subnet) DeepCopyInto(out *Subnet) {
*out = *in
if in.Roles != nil {
in, out := &in.Roles, &out.Roles
*out = make([]SubnetRole, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Subnet.
func (in *Subnet) DeepCopy() *Subnet {
if in == nil {
return nil
}
out := new(Subnet)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *SubnetRole) DeepCopyInto(out *SubnetRole) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SubnetRole.
func (in *SubnetRole) DeepCopy() *SubnetRole {
if in == nil {
return nil
}
out := new(SubnetRole)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *VPC) DeepCopyInto(out *VPC) {
*out = *in
if in.Subnets != nil {
in, out := &in.Subnets, &out.Subnets
*out = make([]Subnet, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VPC.
func (in *VPC) DeepCopy() *VPC {
if in == nil {
return nil
}
out := new(VPC)
in.DeepCopyInto(out)
return out
}

View File

@@ -1,5 +1,6 @@
// Package azure contains Azure-specific structures for installer
// configuration and management.
// +k8s:deepcopy-gen=package
package azure
// Name is the name for the Azure platform.

View File

@@ -0,0 +1,363 @@
//go:build !ignore_autogenerated
// +build !ignore_autogenerated
// Code generated by deepcopy-gen. DO NOT EDIT.
package azure
import (
v1beta1 "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1"
)
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *BootDiagnostics) DeepCopyInto(out *BootDiagnostics) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BootDiagnostics.
func (in *BootDiagnostics) DeepCopy() *BootDiagnostics {
if in == nil {
return nil
}
out := new(BootDiagnostics)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ConfidentialVM) DeepCopyInto(out *ConfidentialVM) {
*out = *in
if in.UEFISettings != nil {
in, out := &in.UEFISettings, &out.UEFISettings
*out = new(UEFISettings)
(*in).DeepCopyInto(*out)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConfidentialVM.
func (in *ConfidentialVM) DeepCopy() *ConfidentialVM {
if in == nil {
return nil
}
out := new(ConfidentialVM)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *CustomerManagedKey) DeepCopyInto(out *CustomerManagedKey) {
*out = *in
out.KeyVault = in.KeyVault
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CustomerManagedKey.
func (in *CustomerManagedKey) DeepCopy() *CustomerManagedKey {
if in == nil {
return nil
}
out := new(CustomerManagedKey)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DiskEncryptionSet) DeepCopyInto(out *DiskEncryptionSet) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DiskEncryptionSet.
func (in *DiskEncryptionSet) DeepCopy() *DiskEncryptionSet {
if in == nil {
return nil
}
out := new(DiskEncryptionSet)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *KeyVault) DeepCopyInto(out *KeyVault) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KeyVault.
func (in *KeyVault) DeepCopy() *KeyVault {
if in == nil {
return nil
}
out := new(KeyVault)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *MachinePool) DeepCopyInto(out *MachinePool) {
*out = *in
if in.Zones != nil {
in, out := &in.Zones, &out.Zones
*out = make([]string, len(*in))
copy(*out, *in)
}
in.OSDisk.DeepCopyInto(&out.OSDisk)
if in.BootDiagnostics != nil {
in, out := &in.BootDiagnostics, &out.BootDiagnostics
*out = new(BootDiagnostics)
**out = **in
}
out.OSImage = in.OSImage
if in.Settings != nil {
in, out := &in.Settings, &out.Settings
*out = new(SecuritySettings)
(*in).DeepCopyInto(*out)
}
if in.Identity != nil {
in, out := &in.Identity, &out.Identity
*out = new(VMIdentity)
(*in).DeepCopyInto(*out)
}
if in.DataDisks != nil {
in, out := &in.DataDisks, &out.DataDisks
*out = make([]v1beta1.DataDisk, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachinePool.
func (in *MachinePool) DeepCopy() *MachinePool {
if in == nil {
return nil
}
out := new(MachinePool)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Metadata) DeepCopyInto(out *Metadata) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Metadata.
func (in *Metadata) DeepCopy() *Metadata {
if in == nil {
return nil
}
out := new(Metadata)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *OSDisk) DeepCopyInto(out *OSDisk) {
*out = *in
if in.DiskEncryptionSet != nil {
in, out := &in.DiskEncryptionSet, &out.DiskEncryptionSet
*out = new(DiskEncryptionSet)
**out = **in
}
if in.SecurityProfile != nil {
in, out := &in.SecurityProfile, &out.SecurityProfile
*out = new(VMDiskSecurityProfile)
(*in).DeepCopyInto(*out)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OSDisk.
func (in *OSDisk) DeepCopy() *OSDisk {
if in == nil {
return nil
}
out := new(OSDisk)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *OSImage) DeepCopyInto(out *OSImage) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OSImage.
func (in *OSImage) DeepCopy() *OSImage {
if in == nil {
return nil
}
out := new(OSImage)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Platform) DeepCopyInto(out *Platform) {
*out = *in
if in.DefaultMachinePlatform != nil {
in, out := &in.DefaultMachinePlatform, &out.DefaultMachinePlatform
*out = new(MachinePool)
(*in).DeepCopyInto(*out)
}
if in.UserTags != nil {
in, out := &in.UserTags, &out.UserTags
*out = make(map[string]string, len(*in))
for key, val := range *in {
(*out)[key] = val
}
}
if in.CustomerManagedKey != nil {
in, out := &in.CustomerManagedKey, &out.CustomerManagedKey
*out = new(CustomerManagedKey)
**out = **in
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Platform.
func (in *Platform) DeepCopy() *Platform {
if in == nil {
return nil
}
out := new(Platform)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *SecuritySettings) DeepCopyInto(out *SecuritySettings) {
*out = *in
if in.ConfidentialVM != nil {
in, out := &in.ConfidentialVM, &out.ConfidentialVM
*out = new(ConfidentialVM)
(*in).DeepCopyInto(*out)
}
if in.TrustedLaunch != nil {
in, out := &in.TrustedLaunch, &out.TrustedLaunch
*out = new(TrustedLaunch)
(*in).DeepCopyInto(*out)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SecuritySettings.
func (in *SecuritySettings) DeepCopy() *SecuritySettings {
if in == nil {
return nil
}
out := new(SecuritySettings)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *TrustedLaunch) DeepCopyInto(out *TrustedLaunch) {
*out = *in
if in.UEFISettings != nil {
in, out := &in.UEFISettings, &out.UEFISettings
*out = new(UEFISettings)
(*in).DeepCopyInto(*out)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TrustedLaunch.
func (in *TrustedLaunch) DeepCopy() *TrustedLaunch {
if in == nil {
return nil
}
out := new(TrustedLaunch)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *UEFISettings) DeepCopyInto(out *UEFISettings) {
*out = *in
if in.SecureBoot != nil {
in, out := &in.SecureBoot, &out.SecureBoot
*out = new(string)
**out = **in
}
if in.VirtualizedTrustedPlatformModule != nil {
in, out := &in.VirtualizedTrustedPlatformModule, &out.VirtualizedTrustedPlatformModule
*out = new(string)
**out = **in
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UEFISettings.
func (in *UEFISettings) DeepCopy() *UEFISettings {
if in == nil {
return nil
}
out := new(UEFISettings)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *UserAssignedIdentity) DeepCopyInto(out *UserAssignedIdentity) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UserAssignedIdentity.
func (in *UserAssignedIdentity) DeepCopy() *UserAssignedIdentity {
if in == nil {
return nil
}
out := new(UserAssignedIdentity)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *VMDiskSecurityProfile) DeepCopyInto(out *VMDiskSecurityProfile) {
*out = *in
if in.DiskEncryptionSet != nil {
in, out := &in.DiskEncryptionSet, &out.DiskEncryptionSet
*out = new(DiskEncryptionSet)
**out = **in
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VMDiskSecurityProfile.
func (in *VMDiskSecurityProfile) DeepCopy() *VMDiskSecurityProfile {
if in == nil {
return nil
}
out := new(VMDiskSecurityProfile)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *VMIdentity) DeepCopyInto(out *VMIdentity) {
*out = *in
if in.UserAssignedIdentities != nil {
in, out := &in.UserAssignedIdentities, &out.UserAssignedIdentities
*out = make([]UserAssignedIdentity, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VMIdentity.
func (in *VMIdentity) DeepCopy() *VMIdentity {
if in == nil {
return nil
}
out := new(VMIdentity)
in.DeepCopyInto(out)
return out
}

View File

@@ -1,5 +1,6 @@
// Package baremetal contains baremetal-specific structures for
// installer configuration and management.
// +k8s:deepcopy-gen=package
package baremetal
// Name is the name for the baremetal platform.

View File

@@ -0,0 +1,163 @@
//go:build !ignore_autogenerated
// +build !ignore_autogenerated
// Code generated by deepcopy-gen. DO NOT EDIT.
package baremetal
import (
configv1 "github.com/openshift/api/config/v1"
v1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
)
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *BMC) DeepCopyInto(out *BMC) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BMC.
func (in *BMC) DeepCopy() *BMC {
if in == nil {
return nil
}
out := new(BMC)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Host) DeepCopyInto(out *Host) {
*out = *in
out.BMC = in.BMC
if in.RootDeviceHints != nil {
in, out := &in.RootDeviceHints, &out.RootDeviceHints
*out = new(RootDeviceHints)
(*in).DeepCopyInto(*out)
}
if in.NetworkConfig != nil {
in, out := &in.NetworkConfig, &out.NetworkConfig
*out = new(v1.JSON)
(*in).DeepCopyInto(*out)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Host.
func (in *Host) DeepCopy() *Host {
if in == nil {
return nil
}
out := new(Host)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *MachinePool) DeepCopyInto(out *MachinePool) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachinePool.
func (in *MachinePool) DeepCopy() *MachinePool {
if in == nil {
return nil
}
out := new(MachinePool)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Metadata) DeepCopyInto(out *Metadata) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Metadata.
func (in *Metadata) DeepCopy() *Metadata {
if in == nil {
return nil
}
out := new(Metadata)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Platform) DeepCopyInto(out *Platform) {
*out = *in
if in.ProvisioningNetworkCIDR != nil {
in, out := &in.ProvisioningNetworkCIDR, &out.ProvisioningNetworkCIDR
*out = (*in).DeepCopy()
}
if in.Hosts != nil {
in, out := &in.Hosts, &out.Hosts
*out = make([]*Host, len(*in))
for i := range *in {
if (*in)[i] != nil {
in, out := &(*in)[i], &(*out)[i]
*out = new(Host)
(*in).DeepCopyInto(*out)
}
}
}
if in.DefaultMachinePlatform != nil {
in, out := &in.DefaultMachinePlatform, &out.DefaultMachinePlatform
*out = new(MachinePool)
**out = **in
}
if in.APIVIPs != nil {
in, out := &in.APIVIPs, &out.APIVIPs
*out = make([]string, len(*in))
copy(*out, *in)
}
if in.IngressVIPs != nil {
in, out := &in.IngressVIPs, &out.IngressVIPs
*out = make([]string, len(*in))
copy(*out, *in)
}
if in.LoadBalancer != nil {
in, out := &in.LoadBalancer, &out.LoadBalancer
*out = new(configv1.BareMetalPlatformLoadBalancer)
**out = **in
}
if in.AdditionalNTPServers != nil {
in, out := &in.AdditionalNTPServers, &out.AdditionalNTPServers
*out = make([]string, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Platform.
func (in *Platform) DeepCopy() *Platform {
if in == nil {
return nil
}
out := new(Platform)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *RootDeviceHints) DeepCopyInto(out *RootDeviceHints) {
*out = *in
if in.Rotational != nil {
in, out := &in.Rotational, &out.Rotational
*out = new(bool)
**out = **in
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RootDeviceHints.
func (in *RootDeviceHints) DeepCopy() *RootDeviceHints {
if in == nil {
return nil
}
out := new(RootDeviceHints)
in.DeepCopyInto(out)
return out
}

View File

@@ -3,4 +3,5 @@
// Package types defines structures for installer configuration and
// management.
// +k8s:deepcopy-gen=package
package types

View File

@@ -1,5 +1,6 @@
// Package none contains generic structures for installer
// Package external contains generic structures for installer
// configuration and management.
// +k8s:deepcopy-gen=package
package external
// Name is name for the External platform.

View File

@@ -0,0 +1,22 @@
//go:build !ignore_autogenerated
// +build !ignore_autogenerated
// Code generated by deepcopy-gen. DO NOT EDIT.
package external
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Platform) DeepCopyInto(out *Platform) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Platform.
func (in *Platform) DeepCopy() *Platform {
if in == nil {
return nil
}
out := new(Platform)
in.DeepCopyInto(out)
return out
}

View File

@@ -1,5 +1,6 @@
// Package gcp contains GCP-specific structures for installer
// configuration and management.
// +k8s:deepcopy-gen=package
package gcp
// Name is name for the gcp platform.

View File

@@ -0,0 +1,346 @@
//go:build !ignore_autogenerated
// +build !ignore_autogenerated
// Code generated by deepcopy-gen. DO NOT EDIT.
package gcp
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DNS) DeepCopyInto(out *DNS) {
*out = *in
if in.PrivateZone != nil {
in, out := &in.PrivateZone, &out.PrivateZone
*out = new(DNSZone)
**out = **in
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DNS.
func (in *DNS) DeepCopy() *DNS {
if in == nil {
return nil
}
out := new(DNS)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DNSZone) DeepCopyInto(out *DNSZone) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DNSZone.
func (in *DNSZone) DeepCopy() *DNSZone {
if in == nil {
return nil
}
out := new(DNSZone)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DNSZoneParams) DeepCopyInto(out *DNSZoneParams) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DNSZoneParams.
func (in *DNSZoneParams) DeepCopy() *DNSZoneParams {
if in == nil {
return nil
}
out := new(DNSZoneParams)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *EncryptionKeyReference) DeepCopyInto(out *EncryptionKeyReference) {
*out = *in
if in.KMSKey != nil {
in, out := &in.KMSKey, &out.KMSKey
*out = new(KMSKeyReference)
**out = **in
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EncryptionKeyReference.
func (in *EncryptionKeyReference) DeepCopy() *EncryptionKeyReference {
if in == nil {
return nil
}
out := new(EncryptionKeyReference)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *KMSKeyReference) DeepCopyInto(out *KMSKeyReference) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KMSKeyReference.
func (in *KMSKeyReference) DeepCopy() *KMSKeyReference {
if in == nil {
return nil
}
out := new(KMSKeyReference)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *MachinePool) DeepCopyInto(out *MachinePool) {
*out = *in
if in.Zones != nil {
in, out := &in.Zones, &out.Zones
*out = make([]string, len(*in))
copy(*out, *in)
}
in.OSDisk.DeepCopyInto(&out.OSDisk)
if in.OSImage != nil {
in, out := &in.OSImage, &out.OSImage
*out = new(OSImage)
**out = **in
}
if in.Tags != nil {
in, out := &in.Tags, &out.Tags
*out = make([]string, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachinePool.
func (in *MachinePool) DeepCopy() *MachinePool {
if in == nil {
return nil
}
out := new(MachinePool)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Metadata) DeepCopyInto(out *Metadata) {
*out = *in
if in.Endpoint != nil {
in, out := &in.Endpoint, &out.Endpoint
*out = new(PSCEndpoint)
(*in).DeepCopyInto(*out)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Metadata.
func (in *Metadata) DeepCopy() *Metadata {
if in == nil {
return nil
}
out := new(Metadata)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Metric) DeepCopyInto(out *Metric) {
*out = *in
if in.Dimensions != nil {
in, out := &in.Dimensions, &out.Dimensions
*out = make(map[string]string, len(*in))
for key, val := range *in {
(*out)[key] = val
}
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Metric.
func (in *Metric) DeepCopy() *Metric {
if in == nil {
return nil
}
out := new(Metric)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *OSDisk) DeepCopyInto(out *OSDisk) {
*out = *in
if in.EncryptionKey != nil {
in, out := &in.EncryptionKey, &out.EncryptionKey
*out = new(EncryptionKeyReference)
(*in).DeepCopyInto(*out)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OSDisk.
func (in *OSDisk) DeepCopy() *OSDisk {
if in == nil {
return nil
}
out := new(OSDisk)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *OSImage) DeepCopyInto(out *OSImage) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OSImage.
func (in *OSImage) DeepCopy() *OSImage {
if in == nil {
return nil
}
out := new(OSImage)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *PSCEndpoint) DeepCopyInto(out *PSCEndpoint) {
*out = *in
if in.ClusterUseOnly != nil {
in, out := &in.ClusterUseOnly, &out.ClusterUseOnly
*out = new(bool)
**out = **in
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PSCEndpoint.
func (in *PSCEndpoint) DeepCopy() *PSCEndpoint {
if in == nil {
return nil
}
out := new(PSCEndpoint)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Platform) DeepCopyInto(out *Platform) {
*out = *in
if in.DefaultMachinePlatform != nil {
in, out := &in.DefaultMachinePlatform, &out.DefaultMachinePlatform
*out = new(MachinePool)
(*in).DeepCopyInto(*out)
}
if in.UserLabels != nil {
in, out := &in.UserLabels, &out.UserLabels
*out = make([]UserLabel, len(*in))
copy(*out, *in)
}
if in.UserTags != nil {
in, out := &in.UserTags, &out.UserTags
*out = make([]UserTag, len(*in))
copy(*out, *in)
}
if in.Endpoint != nil {
in, out := &in.Endpoint, &out.Endpoint
*out = new(PSCEndpoint)
(*in).DeepCopyInto(*out)
}
if in.DNS != nil {
in, out := &in.DNS, &out.DNS
*out = new(DNS)
(*in).DeepCopyInto(*out)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Platform.
func (in *Platform) DeepCopy() *Platform {
if in == nil {
return nil
}
out := new(Platform)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in Quota) DeepCopyInto(out *Quota) {
{
in := &in
*out = make(Quota, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
return
}
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Quota.
func (in Quota) DeepCopy() Quota {
if in == nil {
return nil
}
out := new(Quota)
in.DeepCopyInto(out)
return *out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *QuotaUsage) DeepCopyInto(out *QuotaUsage) {
*out = *in
if in.Metric != nil {
in, out := &in.Metric, &out.Metric
*out = new(Metric)
(*in).DeepCopyInto(*out)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new QuotaUsage.
func (in *QuotaUsage) DeepCopy() *QuotaUsage {
if in == nil {
return nil
}
out := new(QuotaUsage)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *UserLabel) DeepCopyInto(out *UserLabel) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UserLabel.
func (in *UserLabel) DeepCopy() *UserLabel {
if in == nil {
return nil
}
out := new(UserLabel)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *UserTag) DeepCopyInto(out *UserTag) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new UserTag.
func (in *UserTag) DeepCopy() *UserTag {
if in == nil {
return nil
}
out := new(UserTag)
in.DeepCopyInto(out)
return out
}

View File

@@ -1,5 +1,6 @@
// Package ibmcloud contains IBM Cloud-specific structures for installer
// configuration and management.
// +k8s:deepcopy-gen=package
package ibmcloud
// Name is name for the ibmcloud platform.

View File

@@ -0,0 +1,246 @@
//go:build !ignore_autogenerated
// +build !ignore_autogenerated
// Code generated by deepcopy-gen. DO NOT EDIT.
package ibmcloud
import (
v1 "github.com/openshift/api/config/v1"
)
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *BootVolume) DeepCopyInto(out *BootVolume) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BootVolume.
func (in *BootVolume) DeepCopy() *BootVolume {
if in == nil {
return nil
}
out := new(BootVolume)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DedicatedHost) DeepCopyInto(out *DedicatedHost) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DedicatedHost.
func (in *DedicatedHost) DeepCopy() *DedicatedHost {
if in == nil {
return nil
}
out := new(DedicatedHost)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *EndpointsJSON) DeepCopyInto(out *EndpointsJSON) {
*out = *in
if in.IBMCloudEndpointCIS != nil {
in, out := &in.IBMCloudEndpointCIS, &out.IBMCloudEndpointCIS
*out = new(EndpointsVisibility)
(*in).DeepCopyInto(*out)
}
if in.IBMCloudEndpointCOS != nil {
in, out := &in.IBMCloudEndpointCOS, &out.IBMCloudEndpointCOS
*out = new(EndpointsVisibility)
(*in).DeepCopyInto(*out)
}
if in.IBMCloudEndpointCOSConfig != nil {
in, out := &in.IBMCloudEndpointCOSConfig, &out.IBMCloudEndpointCOSConfig
*out = new(EndpointsVisibility)
(*in).DeepCopyInto(*out)
}
if in.IBMCloudEndpointDNSServices != nil {
in, out := &in.IBMCloudEndpointDNSServices, &out.IBMCloudEndpointDNSServices
*out = new(EndpointsVisibility)
(*in).DeepCopyInto(*out)
}
if in.IBMCloudEndpointGlobalCatalog != nil {
in, out := &in.IBMCloudEndpointGlobalCatalog, &out.IBMCloudEndpointGlobalCatalog
*out = new(EndpointsVisibility)
(*in).DeepCopyInto(*out)
}
if in.IBMCloudEndpointGlobalSearch != nil {
in, out := &in.IBMCloudEndpointGlobalSearch, &out.IBMCloudEndpointGlobalSearch
*out = new(EndpointsVisibility)
(*in).DeepCopyInto(*out)
}
if in.IBMCloudEndpointGlobalTagging != nil {
in, out := &in.IBMCloudEndpointGlobalTagging, &out.IBMCloudEndpointGlobalTagging
*out = new(EndpointsVisibility)
(*in).DeepCopyInto(*out)
}
if in.IBMCloudEndpointHyperProtect != nil {
in, out := &in.IBMCloudEndpointHyperProtect, &out.IBMCloudEndpointHyperProtect
*out = new(EndpointsVisibility)
(*in).DeepCopyInto(*out)
}
if in.IBMCloudEndpointIAM != nil {
in, out := &in.IBMCloudEndpointIAM, &out.IBMCloudEndpointIAM
*out = new(EndpointsVisibility)
(*in).DeepCopyInto(*out)
}
if in.IBMCloudEndpointKeyProtect != nil {
in, out := &in.IBMCloudEndpointKeyProtect, &out.IBMCloudEndpointKeyProtect
*out = new(EndpointsVisibility)
(*in).DeepCopyInto(*out)
}
if in.IBMCloudEndpointResourceController != nil {
in, out := &in.IBMCloudEndpointResourceController, &out.IBMCloudEndpointResourceController
*out = new(EndpointsVisibility)
(*in).DeepCopyInto(*out)
}
if in.IBMCloudEndpointResourceManager != nil {
in, out := &in.IBMCloudEndpointResourceManager, &out.IBMCloudEndpointResourceManager
*out = new(EndpointsVisibility)
(*in).DeepCopyInto(*out)
}
if in.IBMCloudEndpointVPC != nil {
in, out := &in.IBMCloudEndpointVPC, &out.IBMCloudEndpointVPC
*out = new(EndpointsVisibility)
(*in).DeepCopyInto(*out)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EndpointsJSON.
func (in *EndpointsJSON) DeepCopy() *EndpointsJSON {
if in == nil {
return nil
}
out := new(EndpointsJSON)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *EndpointsVisibility) DeepCopyInto(out *EndpointsVisibility) {
*out = *in
if in.Private != nil {
in, out := &in.Private, &out.Private
*out = make(map[string]string, len(*in))
for key, val := range *in {
(*out)[key] = val
}
}
if in.Public != nil {
in, out := &in.Public, &out.Public
*out = make(map[string]string, len(*in))
for key, val := range *in {
(*out)[key] = val
}
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EndpointsVisibility.
func (in *EndpointsVisibility) DeepCopy() *EndpointsVisibility {
if in == nil {
return nil
}
out := new(EndpointsVisibility)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *MachinePool) DeepCopyInto(out *MachinePool) {
*out = *in
if in.Zones != nil {
in, out := &in.Zones, &out.Zones
*out = make([]string, len(*in))
copy(*out, *in)
}
if in.BootVolume != nil {
in, out := &in.BootVolume, &out.BootVolume
*out = new(BootVolume)
**out = **in
}
if in.DedicatedHosts != nil {
in, out := &in.DedicatedHosts, &out.DedicatedHosts
*out = make([]DedicatedHost, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachinePool.
func (in *MachinePool) DeepCopy() *MachinePool {
if in == nil {
return nil
}
out := new(MachinePool)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Metadata) DeepCopyInto(out *Metadata) {
*out = *in
if in.ServiceEndpoints != nil {
in, out := &in.ServiceEndpoints, &out.ServiceEndpoints
*out = make([]v1.IBMCloudServiceEndpoint, len(*in))
copy(*out, *in)
}
if in.Subnets != nil {
in, out := &in.Subnets, &out.Subnets
*out = make([]string, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Metadata.
func (in *Metadata) DeepCopy() *Metadata {
if in == nil {
return nil
}
out := new(Metadata)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Platform) DeepCopyInto(out *Platform) {
*out = *in
if in.ControlPlaneSubnets != nil {
in, out := &in.ControlPlaneSubnets, &out.ControlPlaneSubnets
*out = make([]string, len(*in))
copy(*out, *in)
}
if in.ComputeSubnets != nil {
in, out := &in.ComputeSubnets, &out.ComputeSubnets
*out = make([]string, len(*in))
copy(*out, *in)
}
if in.DefaultMachinePlatform != nil {
in, out := &in.DefaultMachinePlatform, &out.DefaultMachinePlatform
*out = new(MachinePool)
(*in).DeepCopyInto(*out)
}
if in.ServiceEndpoints != nil {
in, out := &in.ServiceEndpoints, &out.ServiceEndpoints
*out = make([]v1.IBMCloudServiceEndpoint, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Platform.
func (in *Platform) DeepCopy() *Platform {
if in == nil {
return nil
}
out := new(Platform)
in.DeepCopyInto(out)
return out
}

View File

@@ -86,6 +86,7 @@ const (
)
//go:generate go run ../../vendor/sigs.k8s.io/controller-tools/cmd/controller-gen crd:crdVersions=v1 paths=. output:dir=../../data/data/
//go:generate go run ../../vendor/k8s.io/code-generator/cmd/deepcopy-gen --output-file zz_generated.deepcopy.go ./...
// InstallConfig is the configuration for an OpenShift install.
type InstallConfig struct {

View File

@@ -1,5 +1,6 @@
// Package none contains generic structures for installer
// configuration and management.
// +k8s:deepcopy-gen=package
package none
// Name is name for the None platform.

View File

@@ -0,0 +1,22 @@
//go:build !ignore_autogenerated
// +build !ignore_autogenerated
// Code generated by deepcopy-gen. DO NOT EDIT.
package none
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Platform) DeepCopyInto(out *Platform) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Platform.
func (in *Platform) DeepCopy() *Platform {
if in == nil {
return nil
}
out := new(Platform)
in.DeepCopyInto(out)
return out
}

View File

@@ -1,5 +1,6 @@
// Package nutanix contains Nutanix-specific structures for installer
// configuration and management.
// +k8s:deepcopy-gen=package
package nutanix
// Name is the platform in the package

View File

@@ -0,0 +1,299 @@
//go:build !ignore_autogenerated
// +build !ignore_autogenerated
// Code generated by deepcopy-gen. DO NOT EDIT.
package nutanix
import (
configv1 "github.com/openshift/api/config/v1"
v1 "github.com/openshift/api/machine/v1"
)
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DataDisk) DeepCopyInto(out *DataDisk) {
*out = *in
out.DiskSize = in.DiskSize.DeepCopy()
if in.DeviceProperties != nil {
in, out := &in.DeviceProperties, &out.DeviceProperties
*out = new(v1.NutanixVMDiskDeviceProperties)
**out = **in
}
if in.StorageConfig != nil {
in, out := &in.StorageConfig, &out.StorageConfig
*out = new(StorageConfig)
(*in).DeepCopyInto(*out)
}
if in.DataSourceImage != nil {
in, out := &in.DataSourceImage, &out.DataSourceImage
*out = new(StorageResourceReference)
**out = **in
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DataDisk.
func (in *DataDisk) DeepCopy() *DataDisk {
if in == nil {
return nil
}
out := new(DataDisk)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *FailureDomain) DeepCopyInto(out *FailureDomain) {
*out = *in
out.PrismElement = in.PrismElement
if in.SubnetUUIDs != nil {
in, out := &in.SubnetUUIDs, &out.SubnetUUIDs
*out = make([]string, len(*in))
copy(*out, *in)
}
if in.StorageContainers != nil {
in, out := &in.StorageContainers, &out.StorageContainers
*out = make([]StorageResourceReference, len(*in))
copy(*out, *in)
}
if in.DataSourceImages != nil {
in, out := &in.DataSourceImages, &out.DataSourceImages
*out = make([]StorageResourceReference, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FailureDomain.
func (in *FailureDomain) DeepCopy() *FailureDomain {
if in == nil {
return nil
}
out := new(FailureDomain)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *MachinePool) DeepCopyInto(out *MachinePool) {
*out = *in
out.OSDisk = in.OSDisk
if in.Project != nil {
in, out := &in.Project, &out.Project
*out = new(v1.NutanixResourceIdentifier)
(*in).DeepCopyInto(*out)
}
if in.Categories != nil {
in, out := &in.Categories, &out.Categories
*out = make([]v1.NutanixCategory, len(*in))
copy(*out, *in)
}
if in.GPUs != nil {
in, out := &in.GPUs, &out.GPUs
*out = make([]v1.NutanixGPU, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
if in.DataDisks != nil {
in, out := &in.DataDisks, &out.DataDisks
*out = make([]DataDisk, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
if in.FailureDomains != nil {
in, out := &in.FailureDomains, &out.FailureDomains
*out = make([]string, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachinePool.
func (in *MachinePool) DeepCopy() *MachinePool {
if in == nil {
return nil
}
out := new(MachinePool)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Metadata) DeepCopyInto(out *Metadata) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Metadata.
func (in *Metadata) DeepCopy() *Metadata {
if in == nil {
return nil
}
out := new(Metadata)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *OSDisk) DeepCopyInto(out *OSDisk) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OSDisk.
func (in *OSDisk) DeepCopy() *OSDisk {
if in == nil {
return nil
}
out := new(OSDisk)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Platform) DeepCopyInto(out *Platform) {
*out = *in
out.PrismCentral = in.PrismCentral
if in.PrismElements != nil {
in, out := &in.PrismElements, &out.PrismElements
*out = make([]PrismElement, len(*in))
copy(*out, *in)
}
if in.APIVIPs != nil {
in, out := &in.APIVIPs, &out.APIVIPs
*out = make([]string, len(*in))
copy(*out, *in)
}
if in.IngressVIPs != nil {
in, out := &in.IngressVIPs, &out.IngressVIPs
*out = make([]string, len(*in))
copy(*out, *in)
}
if in.DefaultMachinePlatform != nil {
in, out := &in.DefaultMachinePlatform, &out.DefaultMachinePlatform
*out = new(MachinePool)
(*in).DeepCopyInto(*out)
}
if in.SubnetUUIDs != nil {
in, out := &in.SubnetUUIDs, &out.SubnetUUIDs
*out = make([]string, len(*in))
copy(*out, *in)
}
if in.LoadBalancer != nil {
in, out := &in.LoadBalancer, &out.LoadBalancer
*out = new(configv1.NutanixPlatformLoadBalancer)
**out = **in
}
if in.FailureDomains != nil {
in, out := &in.FailureDomains, &out.FailureDomains
*out = make([]FailureDomain, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
if in.PrismAPICallTimeout != nil {
in, out := &in.PrismAPICallTimeout, &out.PrismAPICallTimeout
*out = new(int)
**out = **in
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Platform.
func (in *Platform) DeepCopy() *Platform {
if in == nil {
return nil
}
out := new(Platform)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *PrismCentral) DeepCopyInto(out *PrismCentral) {
*out = *in
out.Endpoint = in.Endpoint
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PrismCentral.
func (in *PrismCentral) DeepCopy() *PrismCentral {
if in == nil {
return nil
}
out := new(PrismCentral)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *PrismElement) DeepCopyInto(out *PrismElement) {
*out = *in
out.Endpoint = in.Endpoint
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PrismElement.
func (in *PrismElement) DeepCopy() *PrismElement {
if in == nil {
return nil
}
out := new(PrismElement)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *PrismEndpoint) DeepCopyInto(out *PrismEndpoint) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PrismEndpoint.
func (in *PrismEndpoint) DeepCopy() *PrismEndpoint {
if in == nil {
return nil
}
out := new(PrismEndpoint)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *StorageConfig) DeepCopyInto(out *StorageConfig) {
*out = *in
if in.StorageContainer != nil {
in, out := &in.StorageContainer, &out.StorageContainer
*out = new(StorageResourceReference)
**out = **in
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageConfig.
func (in *StorageConfig) DeepCopy() *StorageConfig {
if in == nil {
return nil
}
out := new(StorageConfig)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *StorageResourceReference) DeepCopyInto(out *StorageResourceReference) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageResourceReference.
func (in *StorageResourceReference) DeepCopy() *StorageResourceReference {
if in == nil {
return nil
}
out := new(StorageResourceReference)
in.DeepCopyInto(out)
return out
}

View File

@@ -1,5 +1,6 @@
// Package openstack contains OpenStack-specific structures for
// installer configuration and management.
// +k8s:deepcopy-gen=package
package openstack
// Name is the name for the Openstack platform.

View File

@@ -0,0 +1,219 @@
//go:build !ignore_autogenerated
// +build !ignore_autogenerated
// Code generated by deepcopy-gen. DO NOT EDIT.
package openstack
import (
v1 "github.com/openshift/api/config/v1"
)
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *FixedIP) DeepCopyInto(out *FixedIP) {
*out = *in
out.Subnet = in.Subnet
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FixedIP.
func (in *FixedIP) DeepCopy() *FixedIP {
if in == nil {
return nil
}
out := new(FixedIP)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *MachinePool) DeepCopyInto(out *MachinePool) {
*out = *in
if in.RootVolume != nil {
in, out := &in.RootVolume, &out.RootVolume
*out = new(RootVolume)
(*in).DeepCopyInto(*out)
}
if in.AdditionalNetworkIDs != nil {
in, out := &in.AdditionalNetworkIDs, &out.AdditionalNetworkIDs
*out = make([]string, len(*in))
copy(*out, *in)
}
if in.AdditionalSecurityGroupIDs != nil {
in, out := &in.AdditionalSecurityGroupIDs, &out.AdditionalSecurityGroupIDs
*out = make([]string, len(*in))
copy(*out, *in)
}
if in.Zones != nil {
in, out := &in.Zones, &out.Zones
*out = make([]string, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachinePool.
func (in *MachinePool) DeepCopy() *MachinePool {
if in == nil {
return nil
}
out := new(MachinePool)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Metadata) DeepCopyInto(out *Metadata) {
*out = *in
if in.Identifier != nil {
in, out := &in.Identifier, &out.Identifier
*out = make(map[string]string, len(*in))
for key, val := range *in {
(*out)[key] = val
}
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Metadata.
func (in *Metadata) DeepCopy() *Metadata {
if in == nil {
return nil
}
out := new(Metadata)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *NetworkFilter) DeepCopyInto(out *NetworkFilter) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkFilter.
func (in *NetworkFilter) DeepCopy() *NetworkFilter {
if in == nil {
return nil
}
out := new(NetworkFilter)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Platform) DeepCopyInto(out *Platform) {
*out = *in
if in.DefaultMachinePlatform != nil {
in, out := &in.DefaultMachinePlatform, &out.DefaultMachinePlatform
*out = new(MachinePool)
(*in).DeepCopyInto(*out)
}
if in.ExternalDNS != nil {
in, out := &in.ExternalDNS, &out.ExternalDNS
*out = make([]string, len(*in))
copy(*out, *in)
}
if in.ClusterOSImageProperties != nil {
in, out := &in.ClusterOSImageProperties, &out.ClusterOSImageProperties
*out = make(map[string]string, len(*in))
for key, val := range *in {
(*out)[key] = val
}
}
if in.APIVIPs != nil {
in, out := &in.APIVIPs, &out.APIVIPs
*out = make([]string, len(*in))
copy(*out, *in)
}
if in.IngressVIPs != nil {
in, out := &in.IngressVIPs, &out.IngressVIPs
*out = make([]string, len(*in))
copy(*out, *in)
}
if in.ControlPlanePort != nil {
in, out := &in.ControlPlanePort, &out.ControlPlanePort
*out = new(PortTarget)
(*in).DeepCopyInto(*out)
}
if in.LoadBalancer != nil {
in, out := &in.LoadBalancer, &out.LoadBalancer
*out = new(v1.OpenStackPlatformLoadBalancer)
**out = **in
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Platform.
func (in *Platform) DeepCopy() *Platform {
if in == nil {
return nil
}
out := new(Platform)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *PortTarget) DeepCopyInto(out *PortTarget) {
*out = *in
out.Network = in.Network
if in.FixedIPs != nil {
in, out := &in.FixedIPs, &out.FixedIPs
*out = make([]FixedIP, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PortTarget.
func (in *PortTarget) DeepCopy() *PortTarget {
if in == nil {
return nil
}
out := new(PortTarget)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *RootVolume) DeepCopyInto(out *RootVolume) {
*out = *in
if in.Types != nil {
in, out := &in.Types, &out.Types
*out = make([]string, len(*in))
copy(*out, *in)
}
if in.Zones != nil {
in, out := &in.Zones, &out.Zones
*out = make([]string, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RootVolume.
func (in *RootVolume) DeepCopy() *RootVolume {
if in == nil {
return nil
}
out := new(RootVolume)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *SubnetFilter) DeepCopyInto(out *SubnetFilter) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SubnetFilter.
func (in *SubnetFilter) DeepCopy() *SubnetFilter {
if in == nil {
return nil
}
out := new(SubnetFilter)
in.DeepCopyInto(out)
return out
}

View File

@@ -1,5 +1,6 @@
// Package ovirt contains ovirt-specific structures for
// installer configuration and management.
// +k8s:deepcopy-gen=package
package ovirt
// Name is the name for the ovirt platform.

View File

@@ -0,0 +1,156 @@
//go:build !ignore_autogenerated
// +build !ignore_autogenerated
// Code generated by deepcopy-gen. DO NOT EDIT.
package ovirt
import (
v1 "github.com/openshift/api/config/v1"
)
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *AffinityGroup) DeepCopyInto(out *AffinityGroup) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AffinityGroup.
func (in *AffinityGroup) DeepCopy() *AffinityGroup {
if in == nil {
return nil
}
out := new(AffinityGroup)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *CPU) DeepCopyInto(out *CPU) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CPU.
func (in *CPU) DeepCopy() *CPU {
if in == nil {
return nil
}
out := new(CPU)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Disk) DeepCopyInto(out *Disk) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Disk.
func (in *Disk) DeepCopy() *Disk {
if in == nil {
return nil
}
out := new(Disk)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *MachinePool) DeepCopyInto(out *MachinePool) {
*out = *in
if in.CPU != nil {
in, out := &in.CPU, &out.CPU
*out = new(CPU)
**out = **in
}
if in.OSDisk != nil {
in, out := &in.OSDisk, &out.OSDisk
*out = new(Disk)
**out = **in
}
if in.AffinityGroupsNames != nil {
in, out := &in.AffinityGroupsNames, &out.AffinityGroupsNames
*out = make([]string, len(*in))
copy(*out, *in)
}
if in.Clone != nil {
in, out := &in.Clone, &out.Clone
*out = new(bool)
**out = **in
}
if in.Sparse != nil {
in, out := &in.Sparse, &out.Sparse
*out = new(bool)
**out = **in
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachinePool.
func (in *MachinePool) DeepCopy() *MachinePool {
if in == nil {
return nil
}
out := new(MachinePool)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Metadata) DeepCopyInto(out *Metadata) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Metadata.
func (in *Metadata) DeepCopy() *Metadata {
if in == nil {
return nil
}
out := new(Metadata)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Platform) DeepCopyInto(out *Platform) {
*out = *in
if in.APIVIPs != nil {
in, out := &in.APIVIPs, &out.APIVIPs
*out = make([]string, len(*in))
copy(*out, *in)
}
if in.IngressVIPs != nil {
in, out := &in.IngressVIPs, &out.IngressVIPs
*out = make([]string, len(*in))
copy(*out, *in)
}
if in.DefaultMachinePlatform != nil {
in, out := &in.DefaultMachinePlatform, &out.DefaultMachinePlatform
*out = new(MachinePool)
(*in).DeepCopyInto(*out)
}
if in.AffinityGroups != nil {
in, out := &in.AffinityGroups, &out.AffinityGroups
*out = make([]AffinityGroup, len(*in))
copy(*out, *in)
}
if in.LoadBalancer != nil {
in, out := &in.LoadBalancer, &out.LoadBalancer
*out = new(v1.OvirtPlatformLoadBalancer)
**out = **in
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Platform.
func (in *Platform) DeepCopy() *Platform {
if in == nil {
return nil
}
out := new(Platform)
in.DeepCopyInto(out)
return out
}

View File

@@ -1,5 +1,6 @@
// Package powervs contains Power VS-specific structures for installer
// configuration and management.
// +k8s:deepcopy-gen=package
package powervs
// Name is name for the Power VS platform.

View File

@@ -0,0 +1,133 @@
//go:build !ignore_autogenerated
// +build !ignore_autogenerated
// Code generated by deepcopy-gen. DO NOT EDIT.
package powervs
import (
v1 "github.com/openshift/api/config/v1"
)
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *MachinePool) DeepCopyInto(out *MachinePool) {
*out = *in
if in.VolumeIDs != nil {
in, out := &in.VolumeIDs, &out.VolumeIDs
*out = make([]string, len(*in))
copy(*out, *in)
}
out.Processors = in.Processors
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachinePool.
func (in *MachinePool) DeepCopy() *MachinePool {
if in == nil {
return nil
}
out := new(MachinePool)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Metadata) DeepCopyInto(out *Metadata) {
*out = *in
if in.ServiceEndpoints != nil {
in, out := &in.ServiceEndpoints, &out.ServiceEndpoints
*out = make([]v1.PowerVSServiceEndpoint, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Metadata.
func (in *Metadata) DeepCopy() *Metadata {
if in == nil {
return nil
}
out := new(Metadata)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Platform) DeepCopyInto(out *Platform) {
*out = *in
if in.VPCSubnets != nil {
in, out := &in.VPCSubnets, &out.VPCSubnets
*out = make([]string, len(*in))
copy(*out, *in)
}
if in.DefaultMachinePlatform != nil {
in, out := &in.DefaultMachinePlatform, &out.DefaultMachinePlatform
*out = new(MachinePool)
(*in).DeepCopyInto(*out)
}
if in.ServiceEndpoints != nil {
in, out := &in.ServiceEndpoints, &out.ServiceEndpoints
*out = make([]v1.PowerVSServiceEndpoint, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Platform.
func (in *Platform) DeepCopy() *Platform {
if in == nil {
return nil
}
out := new(Platform)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Region) DeepCopyInto(out *Region) {
*out = *in
if in.Zones != nil {
in, out := &in.Zones, &out.Zones
*out = make(map[string]Zone, len(*in))
for key, val := range *in {
(*out)[key] = *val.DeepCopy()
}
}
if in.VPCZones != nil {
in, out := &in.VPCZones, &out.VPCZones
*out = make([]string, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Region.
func (in *Region) DeepCopy() *Region {
if in == nil {
return nil
}
out := new(Region)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Zone) DeepCopyInto(out *Zone) {
*out = *in
if in.SysTypes != nil {
in, out := &in.SysTypes, &out.SysTypes
*out = make([]string, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Zone.
func (in *Zone) DeepCopy() *Zone {
if in == nil {
return nil
}
out := new(Zone)
in.DeepCopyInto(out)
return out
}

View File

@@ -1,5 +1,6 @@
// Package vsphere contains vSphere-specific structures for installer
// configuration and management.
// +k8s:deepcopy-gen=package
package vsphere
// Name is name for the vsphere platform.

View File

@@ -0,0 +1,283 @@
//go:build !ignore_autogenerated
// +build !ignore_autogenerated
// Code generated by deepcopy-gen. DO NOT EDIT.
package vsphere
import (
v1 "github.com/openshift/api/config/v1"
)
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DataDisk) DeepCopyInto(out *DataDisk) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DataDisk.
func (in *DataDisk) DeepCopy() *DataDisk {
if in == nil {
return nil
}
out := new(DataDisk)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *FailureDomain) DeepCopyInto(out *FailureDomain) {
*out = *in
in.Topology.DeepCopyInto(&out.Topology)
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new FailureDomain.
func (in *FailureDomain) DeepCopy() *FailureDomain {
if in == nil {
return nil
}
out := new(FailureDomain)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Host) DeepCopyInto(out *Host) {
*out = *in
if in.NetworkDevice != nil {
in, out := &in.NetworkDevice, &out.NetworkDevice
*out = new(NetworkDeviceSpec)
(*in).DeepCopyInto(*out)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Host.
func (in *Host) DeepCopy() *Host {
if in == nil {
return nil
}
out := new(Host)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *MachinePool) DeepCopyInto(out *MachinePool) {
*out = *in
out.OSDisk = in.OSDisk
if in.DataDisks != nil {
in, out := &in.DataDisks, &out.DataDisks
*out = make([]DataDisk, len(*in))
copy(*out, *in)
}
if in.Zones != nil {
in, out := &in.Zones, &out.Zones
*out = make([]string, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachinePool.
func (in *MachinePool) DeepCopy() *MachinePool {
if in == nil {
return nil
}
out := new(MachinePool)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Metadata) DeepCopyInto(out *Metadata) {
*out = *in
if in.VCenters != nil {
in, out := &in.VCenters, &out.VCenters
*out = make([]VCenters, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Metadata.
func (in *Metadata) DeepCopy() *Metadata {
if in == nil {
return nil
}
out := new(Metadata)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *NetworkDeviceSpec) DeepCopyInto(out *NetworkDeviceSpec) {
*out = *in
if in.IPAddrs != nil {
in, out := &in.IPAddrs, &out.IPAddrs
*out = make([]string, len(*in))
copy(*out, *in)
}
if in.Nameservers != nil {
in, out := &in.Nameservers, &out.Nameservers
*out = make([]string, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NetworkDeviceSpec.
func (in *NetworkDeviceSpec) DeepCopy() *NetworkDeviceSpec {
if in == nil {
return nil
}
out := new(NetworkDeviceSpec)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *OSDisk) DeepCopyInto(out *OSDisk) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OSDisk.
func (in *OSDisk) DeepCopy() *OSDisk {
if in == nil {
return nil
}
out := new(OSDisk)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Platform) DeepCopyInto(out *Platform) {
*out = *in
if in.APIVIPs != nil {
in, out := &in.APIVIPs, &out.APIVIPs
*out = make([]string, len(*in))
copy(*out, *in)
}
if in.IngressVIPs != nil {
in, out := &in.IngressVIPs, &out.IngressVIPs
*out = make([]string, len(*in))
copy(*out, *in)
}
if in.DefaultMachinePlatform != nil {
in, out := &in.DefaultMachinePlatform, &out.DefaultMachinePlatform
*out = new(MachinePool)
(*in).DeepCopyInto(*out)
}
if in.VCenters != nil {
in, out := &in.VCenters, &out.VCenters
*out = make([]VCenter, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
if in.FailureDomains != nil {
in, out := &in.FailureDomains, &out.FailureDomains
*out = make([]FailureDomain, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
if in.NodeNetworking != nil {
in, out := &in.NodeNetworking, &out.NodeNetworking
*out = new(v1.VSpherePlatformNodeNetworking)
(*in).DeepCopyInto(*out)
}
if in.LoadBalancer != nil {
in, out := &in.LoadBalancer, &out.LoadBalancer
*out = new(v1.VSpherePlatformLoadBalancer)
**out = **in
}
if in.Hosts != nil {
in, out := &in.Hosts, &out.Hosts
*out = make([]*Host, len(*in))
for i := range *in {
if (*in)[i] != nil {
in, out := &(*in)[i], &(*out)[i]
*out = new(Host)
(*in).DeepCopyInto(*out)
}
}
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Platform.
func (in *Platform) DeepCopy() *Platform {
if in == nil {
return nil
}
out := new(Platform)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Topology) DeepCopyInto(out *Topology) {
*out = *in
if in.Networks != nil {
in, out := &in.Networks, &out.Networks
*out = make([]string, len(*in))
copy(*out, *in)
}
if in.TagIDs != nil {
in, out := &in.TagIDs, &out.TagIDs
*out = make([]string, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Topology.
func (in *Topology) DeepCopy() *Topology {
if in == nil {
return nil
}
out := new(Topology)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *VCenter) DeepCopyInto(out *VCenter) {
*out = *in
if in.Datacenters != nil {
in, out := &in.Datacenters, &out.Datacenters
*out = make([]string, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VCenter.
func (in *VCenter) DeepCopy() *VCenter {
if in == nil {
return nil
}
out := new(VCenter)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *VCenters) DeepCopyInto(out *VCenters) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VCenters.
func (in *VCenters) DeepCopy() *VCenters {
if in == nil {
return nil
}
out := new(VCenters)
in.DeepCopyInto(out)
return out
}

View File

@@ -0,0 +1,759 @@
//go:build !ignore_autogenerated
// +build !ignore_autogenerated
// Code generated by deepcopy-gen. DO NOT EDIT.
package types
import (
v1 "github.com/openshift/api/config/v1"
ipnet "github.com/openshift/installer/pkg/ipnet"
aws "github.com/openshift/installer/pkg/types/aws"
azure "github.com/openshift/installer/pkg/types/azure"
baremetal "github.com/openshift/installer/pkg/types/baremetal"
external "github.com/openshift/installer/pkg/types/external"
gcp "github.com/openshift/installer/pkg/types/gcp"
ibmcloud "github.com/openshift/installer/pkg/types/ibmcloud"
none "github.com/openshift/installer/pkg/types/none"
nutanix "github.com/openshift/installer/pkg/types/nutanix"
openstack "github.com/openshift/installer/pkg/types/openstack"
ovirt "github.com/openshift/installer/pkg/types/ovirt"
powervs "github.com/openshift/installer/pkg/types/powervs"
vsphere "github.com/openshift/installer/pkg/types/vsphere"
)
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *BootstrapInPlace) DeepCopyInto(out *BootstrapInPlace) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BootstrapInPlace.
func (in *BootstrapInPlace) DeepCopy() *BootstrapInPlace {
if in == nil {
return nil
}
out := new(BootstrapInPlace)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Capabilities) DeepCopyInto(out *Capabilities) {
*out = *in
if in.AdditionalEnabledCapabilities != nil {
in, out := &in.AdditionalEnabledCapabilities, &out.AdditionalEnabledCapabilities
*out = make([]v1.ClusterVersionCapability, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Capabilities.
func (in *Capabilities) DeepCopy() *Capabilities {
if in == nil {
return nil
}
out := new(Capabilities)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ClusterMetadata) DeepCopyInto(out *ClusterMetadata) {
*out = *in
in.ClusterPlatformMetadata.DeepCopyInto(&out.ClusterPlatformMetadata)
if in.CustomFeatureSet != nil {
in, out := &in.CustomFeatureSet, &out.CustomFeatureSet
*out = new(v1.CustomFeatureGates)
(*in).DeepCopyInto(*out)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterMetadata.
func (in *ClusterMetadata) DeepCopy() *ClusterMetadata {
if in == nil {
return nil
}
out := new(ClusterMetadata)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ClusterNetworkEntry) DeepCopyInto(out *ClusterNetworkEntry) {
*out = *in
in.CIDR.DeepCopyInto(&out.CIDR)
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterNetworkEntry.
func (in *ClusterNetworkEntry) DeepCopy() *ClusterNetworkEntry {
if in == nil {
return nil
}
out := new(ClusterNetworkEntry)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ClusterPlatformMetadata) DeepCopyInto(out *ClusterPlatformMetadata) {
*out = *in
if in.AWS != nil {
in, out := &in.AWS, &out.AWS
*out = new(aws.Metadata)
(*in).DeepCopyInto(*out)
}
if in.OpenStack != nil {
in, out := &in.OpenStack, &out.OpenStack
*out = new(openstack.Metadata)
(*in).DeepCopyInto(*out)
}
if in.Azure != nil {
in, out := &in.Azure, &out.Azure
*out = new(azure.Metadata)
**out = **in
}
if in.GCP != nil {
in, out := &in.GCP, &out.GCP
*out = new(gcp.Metadata)
(*in).DeepCopyInto(*out)
}
if in.IBMCloud != nil {
in, out := &in.IBMCloud, &out.IBMCloud
*out = new(ibmcloud.Metadata)
(*in).DeepCopyInto(*out)
}
if in.BareMetal != nil {
in, out := &in.BareMetal, &out.BareMetal
*out = new(baremetal.Metadata)
**out = **in
}
if in.Ovirt != nil {
in, out := &in.Ovirt, &out.Ovirt
*out = new(ovirt.Metadata)
**out = **in
}
if in.PowerVS != nil {
in, out := &in.PowerVS, &out.PowerVS
*out = new(powervs.Metadata)
(*in).DeepCopyInto(*out)
}
if in.VSphere != nil {
in, out := &in.VSphere, &out.VSphere
*out = new(vsphere.Metadata)
(*in).DeepCopyInto(*out)
}
if in.Nutanix != nil {
in, out := &in.Nutanix, &out.Nutanix
*out = new(nutanix.Metadata)
**out = **in
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterPlatformMetadata.
func (in *ClusterPlatformMetadata) DeepCopy() *ClusterPlatformMetadata {
if in == nil {
return nil
}
out := new(ClusterPlatformMetadata)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ClusterQuota) DeepCopyInto(out *ClusterQuota) {
*out = *in
if in.GCP != nil {
in, out := &in.GCP, &out.GCP
*out = new(gcp.Quota)
if **in != nil {
in, out := *in, *out
*out = make([]gcp.QuotaUsage, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClusterQuota.
func (in *ClusterQuota) DeepCopy() *ClusterQuota {
if in == nil {
return nil
}
out := new(ClusterQuota)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Credential) DeepCopyInto(out *Credential) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Credential.
func (in *Credential) DeepCopy() *Credential {
if in == nil {
return nil
}
out := new(Credential)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Disk) DeepCopyInto(out *Disk) {
*out = *in
if in.UserDefined != nil {
in, out := &in.UserDefined, &out.UserDefined
*out = new(DiskUserDefined)
**out = **in
}
if in.Etcd != nil {
in, out := &in.Etcd, &out.Etcd
*out = new(DiskEtcd)
**out = **in
}
if in.Swap != nil {
in, out := &in.Swap, &out.Swap
*out = new(DiskSwap)
**out = **in
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Disk.
func (in *Disk) DeepCopy() *Disk {
if in == nil {
return nil
}
out := new(Disk)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DiskEtcd) DeepCopyInto(out *DiskEtcd) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DiskEtcd.
func (in *DiskEtcd) DeepCopy() *DiskEtcd {
if in == nil {
return nil
}
out := new(DiskEtcd)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DiskSwap) DeepCopyInto(out *DiskSwap) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DiskSwap.
func (in *DiskSwap) DeepCopy() *DiskSwap {
if in == nil {
return nil
}
out := new(DiskSwap)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DiskUserDefined) DeepCopyInto(out *DiskUserDefined) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DiskUserDefined.
func (in *DiskUserDefined) DeepCopy() *DiskUserDefined {
if in == nil {
return nil
}
out := new(DiskUserDefined)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Fencing) DeepCopyInto(out *Fencing) {
*out = *in
if in.Credentials != nil {
in, out := &in.Credentials, &out.Credentials
*out = make([]*Credential, len(*in))
for i := range *in {
if (*in)[i] != nil {
in, out := &(*in)[i], &(*out)[i]
*out = new(Credential)
**out = **in
}
}
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Fencing.
func (in *Fencing) DeepCopy() *Fencing {
if in == nil {
return nil
}
out := new(Fencing)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *IPv4OVNKubernetesConfig) DeepCopyInto(out *IPv4OVNKubernetesConfig) {
*out = *in
if in.InternalJoinSubnet != nil {
in, out := &in.InternalJoinSubnet, &out.InternalJoinSubnet
*out = (*in).DeepCopy()
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPv4OVNKubernetesConfig.
func (in *IPv4OVNKubernetesConfig) DeepCopy() *IPv4OVNKubernetesConfig {
if in == nil {
return nil
}
out := new(IPv4OVNKubernetesConfig)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ImageContentSource) DeepCopyInto(out *ImageContentSource) {
*out = *in
if in.Mirrors != nil {
in, out := &in.Mirrors, &out.Mirrors
*out = make([]string, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageContentSource.
func (in *ImageContentSource) DeepCopy() *ImageContentSource {
if in == nil {
return nil
}
out := new(ImageContentSource)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ImageDigestSource) DeepCopyInto(out *ImageDigestSource) {
*out = *in
if in.Mirrors != nil {
in, out := &in.Mirrors, &out.Mirrors
*out = make([]string, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageDigestSource.
func (in *ImageDigestSource) DeepCopy() *ImageDigestSource {
if in == nil {
return nil
}
out := new(ImageDigestSource)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *InstallConfig) DeepCopyInto(out *InstallConfig) {
*out = *in
out.TypeMeta = in.TypeMeta
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
if in.Networking != nil {
in, out := &in.Networking, &out.Networking
*out = new(Networking)
(*in).DeepCopyInto(*out)
}
if in.ControlPlane != nil {
in, out := &in.ControlPlane, &out.ControlPlane
*out = new(MachinePool)
(*in).DeepCopyInto(*out)
}
if in.Arbiter != nil {
in, out := &in.Arbiter, &out.Arbiter
*out = new(MachinePool)
(*in).DeepCopyInto(*out)
}
if in.Compute != nil {
in, out := &in.Compute, &out.Compute
*out = make([]MachinePool, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
in.Platform.DeepCopyInto(&out.Platform)
if in.Proxy != nil {
in, out := &in.Proxy, &out.Proxy
*out = new(Proxy)
**out = **in
}
if in.DeprecatedImageContentSources != nil {
in, out := &in.DeprecatedImageContentSources, &out.DeprecatedImageContentSources
*out = make([]ImageContentSource, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
if in.ImageDigestSources != nil {
in, out := &in.ImageDigestSources, &out.ImageDigestSources
*out = make([]ImageDigestSource, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
if in.OperatorPublishingStrategy != nil {
in, out := &in.OperatorPublishingStrategy, &out.OperatorPublishingStrategy
*out = new(OperatorPublishingStrategy)
**out = **in
}
if in.BootstrapInPlace != nil {
in, out := &in.BootstrapInPlace, &out.BootstrapInPlace
*out = new(BootstrapInPlace)
**out = **in
}
if in.Capabilities != nil {
in, out := &in.Capabilities, &out.Capabilities
*out = new(Capabilities)
(*in).DeepCopyInto(*out)
}
if in.FeatureGates != nil {
in, out := &in.FeatureGates, &out.FeatureGates
*out = make([]string, len(*in))
copy(*out, *in)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InstallConfig.
func (in *InstallConfig) DeepCopy() *InstallConfig {
if in == nil {
return nil
}
out := new(InstallConfig)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *MachineNetworkEntry) DeepCopyInto(out *MachineNetworkEntry) {
*out = *in
in.CIDR.DeepCopyInto(&out.CIDR)
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachineNetworkEntry.
func (in *MachineNetworkEntry) DeepCopy() *MachineNetworkEntry {
if in == nil {
return nil
}
out := new(MachineNetworkEntry)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *MachinePool) DeepCopyInto(out *MachinePool) {
*out = *in
if in.Replicas != nil {
in, out := &in.Replicas, &out.Replicas
*out = new(int64)
**out = **in
}
in.Platform.DeepCopyInto(&out.Platform)
if in.Fencing != nil {
in, out := &in.Fencing, &out.Fencing
*out = new(Fencing)
(*in).DeepCopyInto(*out)
}
if in.DiskSetup != nil {
in, out := &in.DiskSetup, &out.DiskSetup
*out = make([]Disk, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachinePool.
func (in *MachinePool) DeepCopy() *MachinePool {
if in == nil {
return nil
}
out := new(MachinePool)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *MachinePoolPlatform) DeepCopyInto(out *MachinePoolPlatform) {
*out = *in
if in.AWS != nil {
in, out := &in.AWS, &out.AWS
*out = new(aws.MachinePool)
(*in).DeepCopyInto(*out)
}
if in.Azure != nil {
in, out := &in.Azure, &out.Azure
*out = new(azure.MachinePool)
(*in).DeepCopyInto(*out)
}
if in.BareMetal != nil {
in, out := &in.BareMetal, &out.BareMetal
*out = new(baremetal.MachinePool)
**out = **in
}
if in.GCP != nil {
in, out := &in.GCP, &out.GCP
*out = new(gcp.MachinePool)
(*in).DeepCopyInto(*out)
}
if in.IBMCloud != nil {
in, out := &in.IBMCloud, &out.IBMCloud
*out = new(ibmcloud.MachinePool)
(*in).DeepCopyInto(*out)
}
if in.OpenStack != nil {
in, out := &in.OpenStack, &out.OpenStack
*out = new(openstack.MachinePool)
(*in).DeepCopyInto(*out)
}
if in.VSphere != nil {
in, out := &in.VSphere, &out.VSphere
*out = new(vsphere.MachinePool)
(*in).DeepCopyInto(*out)
}
if in.Ovirt != nil {
in, out := &in.Ovirt, &out.Ovirt
*out = new(ovirt.MachinePool)
(*in).DeepCopyInto(*out)
}
if in.PowerVS != nil {
in, out := &in.PowerVS, &out.PowerVS
*out = new(powervs.MachinePool)
(*in).DeepCopyInto(*out)
}
if in.Nutanix != nil {
in, out := &in.Nutanix, &out.Nutanix
*out = new(nutanix.MachinePool)
(*in).DeepCopyInto(*out)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new MachinePoolPlatform.
func (in *MachinePoolPlatform) DeepCopy() *MachinePoolPlatform {
if in == nil {
return nil
}
out := new(MachinePoolPlatform)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Networking) DeepCopyInto(out *Networking) {
*out = *in
if in.MachineNetwork != nil {
in, out := &in.MachineNetwork, &out.MachineNetwork
*out = make([]MachineNetworkEntry, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
if in.ClusterNetwork != nil {
in, out := &in.ClusterNetwork, &out.ClusterNetwork
*out = make([]ClusterNetworkEntry, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
if in.ServiceNetwork != nil {
in, out := &in.ServiceNetwork, &out.ServiceNetwork
*out = make([]ipnet.IPNet, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
if in.OVNKubernetesConfig != nil {
in, out := &in.OVNKubernetesConfig, &out.OVNKubernetesConfig
*out = new(OVNKubernetesConfig)
(*in).DeepCopyInto(*out)
}
if in.DeprecatedMachineCIDR != nil {
in, out := &in.DeprecatedMachineCIDR, &out.DeprecatedMachineCIDR
*out = (*in).DeepCopy()
}
if in.DeprecatedServiceCIDR != nil {
in, out := &in.DeprecatedServiceCIDR, &out.DeprecatedServiceCIDR
*out = (*in).DeepCopy()
}
if in.DeprecatedClusterNetworks != nil {
in, out := &in.DeprecatedClusterNetworks, &out.DeprecatedClusterNetworks
*out = make([]ClusterNetworkEntry, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Networking.
func (in *Networking) DeepCopy() *Networking {
if in == nil {
return nil
}
out := new(Networking)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *OVNKubernetesConfig) DeepCopyInto(out *OVNKubernetesConfig) {
*out = *in
if in.IPv4 != nil {
in, out := &in.IPv4, &out.IPv4
*out = new(IPv4OVNKubernetesConfig)
(*in).DeepCopyInto(*out)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OVNKubernetesConfig.
func (in *OVNKubernetesConfig) DeepCopy() *OVNKubernetesConfig {
if in == nil {
return nil
}
out := new(OVNKubernetesConfig)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *OperatorPublishingStrategy) DeepCopyInto(out *OperatorPublishingStrategy) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new OperatorPublishingStrategy.
func (in *OperatorPublishingStrategy) DeepCopy() *OperatorPublishingStrategy {
if in == nil {
return nil
}
out := new(OperatorPublishingStrategy)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Platform) DeepCopyInto(out *Platform) {
*out = *in
if in.AWS != nil {
in, out := &in.AWS, &out.AWS
*out = new(aws.Platform)
(*in).DeepCopyInto(*out)
}
if in.Azure != nil {
in, out := &in.Azure, &out.Azure
*out = new(azure.Platform)
(*in).DeepCopyInto(*out)
}
if in.BareMetal != nil {
in, out := &in.BareMetal, &out.BareMetal
*out = new(baremetal.Platform)
(*in).DeepCopyInto(*out)
}
if in.GCP != nil {
in, out := &in.GCP, &out.GCP
*out = new(gcp.Platform)
(*in).DeepCopyInto(*out)
}
if in.IBMCloud != nil {
in, out := &in.IBMCloud, &out.IBMCloud
*out = new(ibmcloud.Platform)
(*in).DeepCopyInto(*out)
}
if in.None != nil {
in, out := &in.None, &out.None
*out = new(none.Platform)
**out = **in
}
if in.External != nil {
in, out := &in.External, &out.External
*out = new(external.Platform)
**out = **in
}
if in.OpenStack != nil {
in, out := &in.OpenStack, &out.OpenStack
*out = new(openstack.Platform)
(*in).DeepCopyInto(*out)
}
if in.PowerVS != nil {
in, out := &in.PowerVS, &out.PowerVS
*out = new(powervs.Platform)
(*in).DeepCopyInto(*out)
}
if in.VSphere != nil {
in, out := &in.VSphere, &out.VSphere
*out = new(vsphere.Platform)
(*in).DeepCopyInto(*out)
}
if in.Ovirt != nil {
in, out := &in.Ovirt, &out.Ovirt
*out = new(ovirt.Platform)
(*in).DeepCopyInto(*out)
}
if in.Nutanix != nil {
in, out := &in.Nutanix, &out.Nutanix
*out = new(nutanix.Platform)
(*in).DeepCopyInto(*out)
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Platform.
func (in *Platform) DeepCopy() *Platform {
if in == nil {
return nil
}
out := new(Platform)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Proxy) DeepCopyInto(out *Proxy) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Proxy.
func (in *Proxy) DeepCopy() *Proxy {
if in == nil {
return nil
}
out := new(Proxy)
in.DeepCopyInto(out)
return out
}

View File

@@ -13,6 +13,8 @@ import (
_ "github.com/daixiang0/gci" // dependency of hack/go-fmt.sh
// used to generate mocks
_ "go.uber.org/mock/mockgen"
// dependency of generating DeepCopy implementations for install-config
_ "k8s.io/code-generator/cmd/deepcopy-gen"
// dependency of generating CRD for install-config
_ "sigs.k8s.io/controller-tools/cmd/controller-gen"
)

202
vendor/k8s.io/code-generator/LICENSE generated vendored Normal file
View File

@@ -0,0 +1,202 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
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.

View File

@@ -0,0 +1,52 @@
/*
Copyright 2016 The Kubernetes 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.
*/
package args
import (
"fmt"
"github.com/spf13/pflag"
)
type Args struct {
OutputFile string
BoundingDirs []string // Only deal with types rooted under these dirs.
GoHeaderFile string
}
// New returns default arguments for the generator.
func New() *Args {
return &Args{}
}
// AddFlags add the generator flags to the flag set.
func (args *Args) AddFlags(fs *pflag.FlagSet) {
fs.StringVar(&args.OutputFile, "output-file", "generated.deepcopy.go",
"the name of the file to be generated")
fs.StringSliceVar(&args.BoundingDirs, "bounding-dirs", args.BoundingDirs,
"Comma-separated list of import paths which bound the types for which deep-copies will be generated.")
fs.StringVar(&args.GoHeaderFile, "go-header-file", "",
"the path to a file containing boilerplate header text; the string \"YEAR\" will be replaced with the current 4-digit year")
}
// Validate checks the given arguments.
func (args *Args) Validate() error {
if len(args.OutputFile) == 0 {
return fmt.Errorf("--output-file must be specified")
}
return nil
}

View File

@@ -0,0 +1,904 @@
/*
Copyright 2015 The Kubernetes 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.
*/
package generators
import (
"fmt"
"io"
"path"
"sort"
"strings"
"k8s.io/code-generator/cmd/deepcopy-gen/args"
genutil "k8s.io/code-generator/pkg/util"
"k8s.io/gengo/v2"
"k8s.io/gengo/v2/generator"
"k8s.io/gengo/v2/namer"
"k8s.io/gengo/v2/types"
"k8s.io/klog/v2"
)
// This is the comment tag that carries parameters for deep-copy generation.
const (
tagEnabledName = "k8s:deepcopy-gen"
interfacesTagName = tagEnabledName + ":interfaces"
interfacesNonPointerTagName = tagEnabledName + ":nonpointer-interfaces" // attach the DeepCopy<Interface> methods to the
)
// Known values for the comment tag.
const tagValuePackage = "package"
// enabledTagValue holds parameters from a tagName tag.
type enabledTagValue struct {
value string
register bool
}
func extractEnabledTypeTag(t *types.Type) *enabledTagValue {
comments := append(append([]string{}, t.SecondClosestCommentLines...), t.CommentLines...)
return extractEnabledTag(comments)
}
func extractEnabledTag(comments []string) *enabledTagValue {
tags, err := genutil.ExtractCommentTagsWithoutArguments("+", []string{tagEnabledName}, comments)
if err != nil {
klog.Fatalf("Error extracting %s tags: %v", tagEnabledName, err)
}
if tags[tagEnabledName] == nil {
// No match for the tag.
return nil
}
// If there are multiple values, abort.
if len(tags[tagEnabledName]) > 1 {
klog.Fatalf("Found %d %s tags: %q", len(tags[tagEnabledName]), tagEnabledName, tags[tagEnabledName])
}
// If we got here we are returning something.
tag := &enabledTagValue{}
// Get the primary value.
parts := strings.Split(tags[tagEnabledName][0], ",")
if len(parts) >= 1 {
tag.value = parts[0]
}
// Parse extra arguments.
parts = parts[1:]
for i := range parts {
kv := strings.SplitN(parts[i], "=", 2)
k := kv[0]
v := ""
if len(kv) == 2 {
v = kv[1]
}
switch k {
case "register":
if v != "false" {
tag.register = true
}
default:
klog.Fatalf("Unsupported %s param: %q", tagEnabledName, parts[i])
}
}
return tag
}
// TODO: This is created only to reduce number of changes in a single PR.
// Remove it and use PublicNamer instead.
func deepCopyNamer() *namer.NameStrategy {
return &namer.NameStrategy{
Join: func(pre string, in []string, post string) string {
return strings.Join(in, "_")
},
PrependPackageNames: 1,
}
}
// NameSystems returns the name system used by the generators in this package.
func NameSystems() namer.NameSystems {
return namer.NameSystems{
"public": deepCopyNamer(),
"raw": namer.NewRawNamer("", nil),
}
}
// DefaultNameSystem returns the default name system for ordering the types to be
// processed by the generators in this package.
func DefaultNameSystem() string {
return "public"
}
func GetTargets(context *generator.Context, args *args.Args) []generator.Target {
boilerplate, err := gengo.GoBoilerplate(args.GoHeaderFile, gengo.StdBuildTag, gengo.StdGeneratedBy)
if err != nil {
klog.Fatalf("Failed loading boilerplate: %v", err)
}
boundingDirs := []string{}
if args.BoundingDirs == nil {
args.BoundingDirs = context.Inputs
}
for i := range args.BoundingDirs {
// Strip any trailing slashes - they are not exactly "correct" but
// this is friendlier.
boundingDirs = append(boundingDirs, strings.TrimRight(args.BoundingDirs[i], "/"))
}
targets := []generator.Target{}
for _, i := range context.Inputs {
klog.V(3).Infof("Considering pkg %q", i)
pkg := context.Universe[i]
ptag := extractEnabledTag(pkg.Comments)
ptagValue := ""
ptagRegister := false
if ptag != nil {
ptagValue = ptag.value
if ptagValue != tagValuePackage {
klog.Fatalf("Package %v: unsupported %s value: %q", i, tagEnabledName, ptagValue)
}
ptagRegister = ptag.register
klog.V(3).Infof(" tag.value: %q, tag.register: %t", ptagValue, ptagRegister)
} else {
klog.V(3).Infof(" no tag")
}
// If the pkg-scoped tag says to generate, we can skip scanning types.
pkgNeedsGeneration := (ptagValue == tagValuePackage)
if !pkgNeedsGeneration {
// If the pkg-scoped tag did not exist, scan all types for one that
// explicitly wants generation. Ensure all types that want generation
// can be copied.
var uncopyable []string
for _, t := range pkg.Types {
klog.V(3).Infof(" considering type %q", t.Name.String())
ttag := extractEnabledTypeTag(t)
if ttag != nil && ttag.value == "true" {
klog.V(3).Infof(" tag=true")
if !copyableType(t) {
uncopyable = append(uncopyable, fmt.Sprintf("%v", t))
} else {
pkgNeedsGeneration = true
}
}
}
if len(uncopyable) > 0 {
klog.Fatalf("Types requested deepcopy generation but are not copyable: %s",
strings.Join(uncopyable, ", "))
}
}
if pkgNeedsGeneration {
klog.V(3).Infof("Package %q needs generation", i)
targets = append(targets,
&generator.SimpleTarget{
PkgName: strings.Split(path.Base(pkg.Path), ".")[0],
PkgPath: pkg.Path,
PkgDir: pkg.Dir, // output pkg is the same as the input
HeaderComment: boilerplate,
FilterFunc: func(c *generator.Context, t *types.Type) bool {
return t.Name.Package == pkg.Path
},
GeneratorsFunc: func(c *generator.Context) (generators []generator.Generator) {
return []generator.Generator{
NewGenDeepCopy(args.OutputFile, pkg.Path, boundingDirs, (ptagValue == tagValuePackage), ptagRegister),
}
},
})
}
}
return targets
}
// genDeepCopy produces a file with autogenerated deep-copy functions.
type genDeepCopy struct {
generator.GoGenerator
targetPackage string
boundingDirs []string
allTypes bool
registerTypes bool
imports namer.ImportTracker
typesForInit []*types.Type
}
func NewGenDeepCopy(outputFilename, targetPackage string, boundingDirs []string, allTypes, registerTypes bool) generator.Generator {
return &genDeepCopy{
GoGenerator: generator.GoGenerator{
OutputFilename: outputFilename,
},
targetPackage: targetPackage,
boundingDirs: boundingDirs,
allTypes: allTypes,
registerTypes: registerTypes,
imports: generator.NewImportTrackerForPackage(targetPackage),
typesForInit: make([]*types.Type, 0),
}
}
func (g *genDeepCopy) Namers(c *generator.Context) namer.NameSystems {
// Have the raw namer for this file track what it imports.
return namer.NameSystems{
"raw": namer.NewRawNamer(g.targetPackage, g.imports),
}
}
func (g *genDeepCopy) Filter(c *generator.Context, t *types.Type) bool {
// Filter out types not being processed or not copyable within the package.
enabled := g.allTypes
if !enabled {
ttag := extractEnabledTypeTag(t)
if ttag != nil && ttag.value == "true" {
enabled = true
}
}
if !enabled {
return false
}
if !copyableType(t) {
klog.V(3).Infof("Type %v is not copyable", t)
return false
}
klog.V(3).Infof("Type %v is copyable", t)
g.typesForInit = append(g.typesForInit, t)
return true
}
// deepCopyMethod returns the signature of a DeepCopy() method, nil or an error
// if the type does not match. This allows more efficient deep copy
// implementations to be defined by the type's author. The correct signature
// for a type T is:
//
// func (t T) DeepCopy() T
//
// or:
//
// func (t *T) DeepCopy() *T
func deepCopyMethod(t *types.Type) (*types.Signature, error) {
f, found := t.Methods["DeepCopy"]
if !found {
return nil, nil
}
if len(f.Signature.Parameters) != 0 {
return nil, fmt.Errorf("type %v: invalid DeepCopy signature, expected no parameters", t)
}
if len(f.Signature.Results) != 1 {
return nil, fmt.Errorf("type %v: invalid DeepCopy signature, expected exactly one result", t)
}
ptrResult := f.Signature.Results[0].Type.Kind == types.Pointer && f.Signature.Results[0].Type.Elem.Name == t.Name
nonPtrResult := f.Signature.Results[0].Type.Name == t.Name
if !ptrResult && !nonPtrResult {
return nil, fmt.Errorf("type %v: invalid DeepCopy signature, expected to return %s or *%s", t, t.Name.Name, t.Name.Name)
}
ptrRcvr := f.Signature.Receiver != nil && f.Signature.Receiver.Kind == types.Pointer && f.Signature.Receiver.Elem.Name == t.Name
nonPtrRcvr := f.Signature.Receiver != nil && f.Signature.Receiver.Name == t.Name
if ptrRcvr && !ptrResult {
return nil, fmt.Errorf("type %v: invalid DeepCopy signature, expected a *%s result for a *%s receiver", t, t.Name.Name, t.Name.Name)
}
if nonPtrRcvr && !nonPtrResult {
return nil, fmt.Errorf("type %v: invalid DeepCopy signature, expected a %s result for a %s receiver", t, t.Name.Name, t.Name.Name)
}
return f.Signature, nil
}
// deepCopyMethodOrDie returns the signatrue of a DeepCopy method, nil or calls klog.Fatalf
// if the type does not match.
func deepCopyMethodOrDie(t *types.Type) *types.Signature {
ret, err := deepCopyMethod(t)
if err != nil {
klog.Fatal(err)
}
return ret
}
// deepCopyIntoMethod returns the signature of a DeepCopyInto() method, nil or an error
// if the type is wrong. DeepCopyInto allows more efficient deep copy
// implementations to be defined by the type's author. The correct signature
// for a type T is:
//
// func (t T) DeepCopyInto(t *T)
//
// or:
//
// func (t *T) DeepCopyInto(t *T)
func deepCopyIntoMethod(t *types.Type) (*types.Signature, error) {
f, found := t.Methods["DeepCopyInto"]
if !found {
return nil, nil
}
if len(f.Signature.Parameters) != 1 {
return nil, fmt.Errorf("type %v: invalid DeepCopy signature, expected exactly one parameter", t)
}
if len(f.Signature.Results) != 0 {
return nil, fmt.Errorf("type %v: invalid DeepCopy signature, expected no result type", t)
}
ptrParam := f.Signature.Parameters[0].Type.Kind == types.Pointer && f.Signature.Parameters[0].Type.Elem.Name == t.Name
if !ptrParam {
return nil, fmt.Errorf("type %v: invalid DeepCopy signature, expected parameter of type *%s", t, t.Name.Name)
}
ptrRcvr := f.Signature.Receiver != nil && f.Signature.Receiver.Kind == types.Pointer && f.Signature.Receiver.Elem.Name == t.Name
nonPtrRcvr := f.Signature.Receiver != nil && f.Signature.Receiver.Name == t.Name
if !ptrRcvr && !nonPtrRcvr {
// this should never happen
return nil, fmt.Errorf("type %v: invalid DeepCopy signature, expected a receiver of type %s or *%s", t, t.Name.Name, t.Name.Name)
}
return f.Signature, nil
}
// deepCopyIntoMethodOrDie returns the signature of a DeepCopyInto() method, nil or calls klog.Fatalf
// if the type is wrong.
func deepCopyIntoMethodOrDie(t *types.Type) *types.Signature {
ret, err := deepCopyIntoMethod(t)
if err != nil {
klog.Fatal(err)
}
return ret
}
func copyableType(t *types.Type) bool {
// If the type opts out of copy-generation, stop.
ttag := extractEnabledTypeTag(t)
if ttag != nil && ttag.value == "false" {
return false
}
// Filter out private types.
if namer.IsPrivateGoName(t.Name.Name) {
return false
}
if t.Kind == types.Alias {
// if the underlying built-in is not deepcopy-able, deepcopy is opt-in through definition of custom methods.
// Note that aliases of builtins, maps, slices can have deepcopy methods.
if deepCopyMethodOrDie(t) != nil || deepCopyIntoMethodOrDie(t) != nil {
return true
} else {
return t.Underlying.Kind != types.Builtin || copyableType(t.Underlying)
}
}
if t.Kind != types.Struct {
return false
}
return true
}
func underlyingType(t *types.Type) *types.Type {
for t.Kind == types.Alias {
t = t.Underlying
}
return t
}
func (g *genDeepCopy) isOtherPackage(pkg string) bool {
if pkg == g.targetPackage {
return false
}
if strings.HasSuffix(pkg, "\""+g.targetPackage+"\"") {
return false
}
return true
}
func (g *genDeepCopy) Imports(c *generator.Context) (imports []string) {
importLines := []string{}
for _, singleImport := range g.imports.ImportLines() {
if g.isOtherPackage(singleImport) {
importLines = append(importLines, singleImport)
}
}
return importLines
}
func argsFromType(ts ...*types.Type) generator.Args {
a := generator.Args{
"type": ts[0],
}
for i, t := range ts {
a[fmt.Sprintf("type%d", i+1)] = t
}
return a
}
func (g *genDeepCopy) Init(c *generator.Context, w io.Writer) error {
return nil
}
func (g *genDeepCopy) needsGeneration(t *types.Type) bool {
tag := extractEnabledTypeTag(t)
tv := ""
if tag != nil {
tv = tag.value
if tv != "true" && tv != "false" {
klog.Fatalf("Type %v: unsupported %s value: %q", t, tagEnabledName, tag.value)
}
}
if g.allTypes && tv == "false" {
// The whole package is being generated, but this type has opted out.
klog.V(2).Infof("Not generating for type %v because type opted out", t)
return false
}
if !g.allTypes && tv != "true" {
// The whole package is NOT being generated, and this type has NOT opted in.
klog.V(2).Infof("Not generating for type %v because type did not opt in", t)
return false
}
return true
}
func extractInterfacesTag(t *types.Type) []string {
var result []string
comments := append(append([]string{}, t.SecondClosestCommentLines...), t.CommentLines...)
tags, err := genutil.ExtractCommentTagsWithoutArguments("+", []string{interfacesTagName}, comments)
if err != nil {
klog.Fatalf("Error extracting %s tags: %v", interfacesTagName, err)
}
for _, v := range tags[interfacesTagName] {
if len(v) == 0 {
continue
}
intfs := strings.Split(v, ",")
for _, intf := range intfs {
if intf == "" {
continue
}
result = append(result, intf)
}
}
return result
}
func extractNonPointerInterfaces(t *types.Type) (bool, error) {
comments := append(append([]string{}, t.SecondClosestCommentLines...), t.CommentLines...)
tags, err := genutil.ExtractCommentTagsWithoutArguments("+", []string{interfacesNonPointerTagName}, comments)
if err != nil {
return false, fmt.Errorf("failed to parse comments: %w", err)
}
values := tags[interfacesNonPointerTagName]
if len(values) == 0 {
return false, nil
}
result := values[0] == "true"
for _, v := range values {
if v == "true" != result {
return false, fmt.Errorf("contradicting %v value %q found to previous value %v", interfacesNonPointerTagName, v, result)
}
}
return result, nil
}
func (g *genDeepCopy) deepCopyableInterfacesInner(c *generator.Context, t *types.Type) ([]*types.Type, error) {
if t.Kind != types.Struct {
return nil, nil
}
intfs := extractInterfacesTag(t)
var ts []*types.Type
for _, intf := range intfs {
t := types.ParseFullyQualifiedName(intf)
klog.V(3).Infof("Loading package for interface %v", intf)
_, err := c.LoadPackages(t.Package)
if err != nil {
return nil, err
}
intfT := c.Universe.Type(t)
if intfT == nil {
return nil, fmt.Errorf("unknown type %q in %s tag of type %s", intf, interfacesTagName, intfT)
}
if intfT.Kind != types.Interface {
return nil, fmt.Errorf("type %q in %s tag of type %s is not an interface, but: %q", intf, interfacesTagName, t, intfT.Kind)
}
g.imports.AddType(intfT)
ts = append(ts, intfT)
}
return ts, nil
}
// deepCopyableInterfaces returns the interface types to implement and whether they apply to a non-pointer receiver.
func (g *genDeepCopy) deepCopyableInterfaces(c *generator.Context, t *types.Type) ([]*types.Type, bool, error) {
ts, err := g.deepCopyableInterfacesInner(c, t)
if err != nil {
return nil, false, err
}
set := map[string]*types.Type{}
for _, t := range ts {
set[t.String()] = t
}
result := []*types.Type{}
for _, t := range set {
result = append(result, t)
}
TypeSlice(result).Sort() // we need a stable sorting because it determines the order in generation
nonPointerReceiver, err := extractNonPointerInterfaces(t)
if err != nil {
return nil, false, err
}
return result, nonPointerReceiver, nil
}
type TypeSlice []*types.Type
func (s TypeSlice) Len() int { return len(s) }
func (s TypeSlice) Less(i, j int) bool { return s[i].String() < s[j].String() }
func (s TypeSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
func (s TypeSlice) Sort() { sort.Sort(s) }
func (g *genDeepCopy) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error {
if !g.needsGeneration(t) {
return nil
}
klog.V(2).Infof("Generating deepcopy functions for type %v", t)
sw := generator.NewSnippetWriter(w, c, "$", "$")
args := argsFromType(t)
if deepCopyIntoMethodOrDie(t) == nil {
sw.Do("// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.\n", args)
if isReference(t) {
sw.Do("func (in $.type|raw$) DeepCopyInto(out *$.type|raw$) {\n", args)
sw.Do("{in:=&in\n", nil)
} else {
sw.Do("func (in *$.type|raw$) DeepCopyInto(out *$.type|raw$) {\n", args)
}
if deepCopyMethodOrDie(t) != nil {
if t.Methods["DeepCopy"].Signature.Receiver.Kind == types.Pointer {
sw.Do("clone := in.DeepCopy()\n", nil)
sw.Do("*out = *clone\n", nil)
} else {
sw.Do("*out = in.DeepCopy()\n", nil)
}
sw.Do("return\n", nil)
} else {
g.generateFor(t, sw)
sw.Do("return\n", nil)
}
if isReference(t) {
sw.Do("}\n", nil)
}
sw.Do("}\n\n", nil)
}
if deepCopyMethodOrDie(t) == nil {
sw.Do("// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new $.type|raw$.\n", args)
if isReference(t) {
sw.Do("func (in $.type|raw$) DeepCopy() $.type|raw$ {\n", args)
} else {
sw.Do("func (in *$.type|raw$) DeepCopy() *$.type|raw$ {\n", args)
}
sw.Do("if in == nil { return nil }\n", nil)
sw.Do("out := new($.type|raw$)\n", args)
sw.Do("in.DeepCopyInto(out)\n", nil)
if isReference(t) {
sw.Do("return *out\n", nil)
} else {
sw.Do("return out\n", nil)
}
sw.Do("}\n\n", nil)
}
intfs, nonPointerReceiver, err := g.deepCopyableInterfaces(c, t)
if err != nil {
return err
}
for _, intf := range intfs {
sw.Do(fmt.Sprintf("// DeepCopy%s is an autogenerated deepcopy function, copying the receiver, creating a new $.type2|raw$.\n", intf.Name.Name), argsFromType(t, intf))
if nonPointerReceiver {
sw.Do(fmt.Sprintf("func (in $.type|raw$) DeepCopy%s() $.type2|raw$ {\n", intf.Name.Name), argsFromType(t, intf))
sw.Do("return *in.DeepCopy()", nil)
sw.Do("}\n\n", nil)
} else {
sw.Do(fmt.Sprintf("func (in *$.type|raw$) DeepCopy%s() $.type2|raw$ {\n", intf.Name.Name), argsFromType(t, intf))
sw.Do("if c := in.DeepCopy(); c != nil {\n", nil)
sw.Do("return c\n", nil)
sw.Do("}\n", nil)
sw.Do("return nil\n", nil)
sw.Do("}\n\n", nil)
}
}
return sw.Error()
}
// isReference return true for pointer, maps, slices and aliases of those.
func isReference(t *types.Type) bool {
if t.Kind == types.Pointer || t.Kind == types.Map || t.Kind == types.Slice {
return true
}
return t.Kind == types.Alias && isReference(underlyingType(t))
}
// we use the system of shadowing 'in' and 'out' so that the same code is valid
// at any nesting level. This makes the autogenerator easy to understand, and
// the compiler shouldn't care.
func (g *genDeepCopy) generateFor(t *types.Type, sw *generator.SnippetWriter) {
// derive inner types if t is an alias. We call the do* methods below with the alias type.
// basic rule: generate according to inner type, but construct objects with the alias type.
ut := underlyingType(t)
var f func(*types.Type, *generator.SnippetWriter)
switch ut.Kind {
case types.Builtin:
f = g.doBuiltin
case types.Map:
f = g.doMap
case types.Slice:
f = g.doSlice
case types.Struct:
f = g.doStruct
case types.Pointer:
f = g.doPointer
case types.Interface:
// interfaces are handled in-line in the other cases
klog.Fatalf("Hit an interface type %v. This should never happen.", t)
case types.Alias:
// can never happen because we branch on the underlying type which is never an alias
klog.Fatalf("Hit an alias type %v. This should never happen.", t)
default:
klog.Fatalf("Hit an unsupported type %v.", t)
}
f(t, sw)
}
// doBuiltin generates code for a builtin or an alias to a builtin. The generated code is
// is the same for both cases, i.e. it's the code for the underlying type.
func (g *genDeepCopy) doBuiltin(t *types.Type, sw *generator.SnippetWriter) {
if deepCopyMethodOrDie(t) != nil || deepCopyIntoMethodOrDie(t) != nil {
sw.Do("*out = in.DeepCopy()\n", nil)
return
}
sw.Do("*out = *in\n", nil)
}
// doMap generates code for a map or an alias to a map. The generated code is
// is the same for both cases, i.e. it's the code for the underlying type.
func (g *genDeepCopy) doMap(t *types.Type, sw *generator.SnippetWriter) {
ut := underlyingType(t)
uet := underlyingType(ut.Elem)
if deepCopyMethodOrDie(t) != nil || deepCopyIntoMethodOrDie(t) != nil {
sw.Do("*out = in.DeepCopy()\n", nil)
return
}
if !ut.Key.IsAssignable() {
klog.Fatalf("Hit an unsupported type %v for: %v", uet, t)
}
sw.Do("*out = make($.|raw$, len(*in))\n", t)
sw.Do("for key, val := range *in {\n", nil)
dc, dci := deepCopyMethodOrDie(ut.Elem), deepCopyIntoMethodOrDie(ut.Elem)
switch {
case dc != nil || dci != nil:
// Note: a DeepCopy exists because it is added if DeepCopyInto is manually defined
leftPointer := ut.Elem.Kind == types.Pointer
rightPointer := !isReference(ut.Elem)
if dc != nil {
rightPointer = dc.Results[0].Type.Kind == types.Pointer
}
if leftPointer == rightPointer {
sw.Do("(*out)[key] = val.DeepCopy()\n", nil)
} else if leftPointer {
sw.Do("x := val.DeepCopy()\n", nil)
sw.Do("(*out)[key] = &x\n", nil)
} else {
sw.Do("(*out)[key] = *val.DeepCopy()\n", nil)
}
case ut.Elem.IsAnonymousStruct(): // not uet here because it needs type cast
sw.Do("(*out)[key] = val\n", nil)
case uet.IsAssignable():
sw.Do("(*out)[key] = val\n", nil)
case uet.Kind == types.Interface:
// Note: do not generate code that won't compile as `DeepCopyinterface{}()` is not a valid function
if uet.Name.Name == "interface{}" {
klog.Fatalf("DeepCopy of %q is unsupported. Instead, use named interfaces with DeepCopy<named-interface> as one of the methods.", uet.Name.Name)
}
sw.Do("if val == nil {(*out)[key]=nil} else {\n", nil)
// Note: if t.Elem has been an alias "J" of an interface "I" in Go, we will see it
// as kind Interface of name "J" here, i.e. generate val.DeepCopyJ(). The golang
// parser does not give us the underlying interface name. So we cannot do any better.
sw.Do(fmt.Sprintf("(*out)[key] = val.DeepCopy%s()\n", uet.Name.Name), nil)
sw.Do("}\n", nil)
case uet.Kind == types.Slice || uet.Kind == types.Map || uet.Kind == types.Pointer:
sw.Do("var outVal $.|raw$\n", uet)
sw.Do("if val == nil { (*out)[key] = nil } else {\n", nil)
sw.Do("in, out := &val, &outVal\n", uet)
g.generateFor(ut.Elem, sw)
sw.Do("}\n", nil)
sw.Do("(*out)[key] = outVal\n", nil)
case uet.Kind == types.Struct:
sw.Do("(*out)[key] = *val.DeepCopy()\n", uet)
default:
klog.Fatalf("Hit an unsupported type %v for %v", uet, t)
}
sw.Do("}\n", nil)
}
// doSlice generates code for a slice or an alias to a slice. The generated code is
// is the same for both cases, i.e. it's the code for the underlying type.
func (g *genDeepCopy) doSlice(t *types.Type, sw *generator.SnippetWriter) {
ut := underlyingType(t)
uet := underlyingType(ut.Elem)
if deepCopyMethodOrDie(t) != nil || deepCopyIntoMethodOrDie(t) != nil {
sw.Do("*out = in.DeepCopy()\n", nil)
return
}
sw.Do("*out = make($.|raw$, len(*in))\n", t)
if deepCopyMethodOrDie(ut.Elem) != nil || deepCopyIntoMethodOrDie(ut.Elem) != nil {
sw.Do("for i := range *in {\n", nil)
// Note: a DeepCopyInto exists because it is added if DeepCopy is manually defined
sw.Do("(*in)[i].DeepCopyInto(&(*out)[i])\n", nil)
sw.Do("}\n", nil)
} else if uet.Kind == types.Builtin || uet.IsAssignable() {
sw.Do("copy(*out, *in)\n", nil)
} else {
sw.Do("for i := range *in {\n", nil)
if uet.Kind == types.Slice || uet.Kind == types.Map || uet.Kind == types.Pointer || deepCopyMethodOrDie(ut.Elem) != nil || deepCopyIntoMethodOrDie(ut.Elem) != nil {
sw.Do("if (*in)[i] != nil {\n", nil)
sw.Do("in, out := &(*in)[i], &(*out)[i]\n", nil)
g.generateFor(ut.Elem, sw)
sw.Do("}\n", nil)
} else if uet.Kind == types.Interface {
// Note: do not generate code that won't compile as `DeepCopyinterface{}()` is not a valid function
if uet.Name.Name == "interface{}" {
klog.Fatalf("DeepCopy of %q is unsupported. Instead, use named interfaces with DeepCopy<named-interface> as one of the methods.", uet.Name.Name)
}
sw.Do("if (*in)[i] != nil {\n", nil)
// Note: if t.Elem has been an alias "J" of an interface "I" in Go, we will see it
// as kind Interface of name "J" here, i.e. generate val.DeepCopyJ(). The golang
// parser does not give us the underlying interface name. So we cannot do any better.
sw.Do(fmt.Sprintf("(*out)[i] = (*in)[i].DeepCopy%s()\n", uet.Name.Name), nil)
sw.Do("}\n", nil)
} else if uet.Kind == types.Struct {
sw.Do("(*in)[i].DeepCopyInto(&(*out)[i])\n", nil)
} else {
klog.Fatalf("Hit an unsupported type %v for %v", uet, t)
}
sw.Do("}\n", nil)
}
}
// doStruct generates code for a struct or an alias to a struct. The generated code is
// is the same for both cases, i.e. it's the code for the underlying type.
func (g *genDeepCopy) doStruct(t *types.Type, sw *generator.SnippetWriter) {
ut := underlyingType(t)
if deepCopyMethodOrDie(t) != nil || deepCopyIntoMethodOrDie(t) != nil {
sw.Do("*out = in.DeepCopy()\n", nil)
return
}
// Simple copy covers a lot of cases.
sw.Do("*out = *in\n", nil)
// Now fix-up fields as needed.
for _, m := range ut.Members {
ft := m.Type
uft := underlyingType(ft)
args := generator.Args{
"type": ft,
"kind": ft.Kind,
"name": m.Name,
}
dc, dci := deepCopyMethodOrDie(ft), deepCopyIntoMethodOrDie(ft)
switch {
case dc != nil || dci != nil:
// Note: a DeepCopyInto exists because it is added if DeepCopy is manually defined
leftPointer := ft.Kind == types.Pointer
rightPointer := !isReference(ft)
if dc != nil {
rightPointer = dc.Results[0].Type.Kind == types.Pointer
}
if leftPointer == rightPointer {
sw.Do("out.$.name$ = in.$.name$.DeepCopy()\n", args)
} else if leftPointer {
sw.Do("x := in.$.name$.DeepCopy()\n", args)
sw.Do("out.$.name$ = = &x\n", args)
} else {
sw.Do("in.$.name$.DeepCopyInto(&out.$.name$)\n", args)
}
case uft.Kind == types.Builtin:
// the initial *out = *in was enough
case uft.Kind == types.Map, uft.Kind == types.Slice, uft.Kind == types.Pointer:
// Fixup non-nil reference-semantic types.
sw.Do("if in.$.name$ != nil {\n", args)
sw.Do("in, out := &in.$.name$, &out.$.name$\n", args)
g.generateFor(ft, sw)
sw.Do("}\n", nil)
case uft.Kind == types.Array:
sw.Do("out.$.name$ = in.$.name$\n", args)
case uft.Kind == types.Struct:
if ft.IsAssignable() {
sw.Do("out.$.name$ = in.$.name$\n", args)
} else {
sw.Do("in.$.name$.DeepCopyInto(&out.$.name$)\n", args)
}
case uft.Kind == types.Interface:
// Note: do not generate code that won't compile as `DeepCopyinterface{}()` is not a valid function
if uft.Name.Name == "interface{}" {
klog.Fatalf("DeepCopy of %q is unsupported. Instead, use named interfaces with DeepCopy<named-interface> as one of the methods.", uft.Name.Name)
}
sw.Do("if in.$.name$ != nil {\n", args)
// Note: if t.Elem has been an alias "J" of an interface "I" in Go, we will see it
// as kind Interface of name "J" here, i.e. generate val.DeepCopyJ(). The golang
// parser does not give us the underlying interface name. So we cannot do any better.
sw.Do(fmt.Sprintf("out.$.name$ = in.$.name$.DeepCopy%s()\n", uft.Name.Name), args)
sw.Do("}\n", nil)
default:
klog.Fatalf("Hit an unsupported type '%v' for '%v', from %v.%v", uft, ft, t, m.Name)
}
}
}
// doPointer generates code for a pointer or an alias to a pointer. The generated code is
// is the same for both cases, i.e. it's the code for the underlying type.
func (g *genDeepCopy) doPointer(t *types.Type, sw *generator.SnippetWriter) {
ut := underlyingType(t)
uet := underlyingType(ut.Elem)
dc, dci := deepCopyMethodOrDie(ut.Elem), deepCopyIntoMethodOrDie(ut.Elem)
switch {
case dc != nil || dci != nil:
rightPointer := !isReference(ut.Elem)
if dc != nil {
rightPointer = dc.Results[0].Type.Kind == types.Pointer
}
if rightPointer {
sw.Do("*out = (*in).DeepCopy()\n", nil)
} else {
sw.Do("x := (*in).DeepCopy()\n", nil)
sw.Do("*out = &x\n", nil)
}
case uet.IsAssignable():
sw.Do("*out = new($.Elem|raw$)\n", ut)
sw.Do("**out = **in", nil)
case uet.Kind == types.Map, uet.Kind == types.Slice, uet.Kind == types.Pointer:
sw.Do("*out = new($.Elem|raw$)\n", ut)
sw.Do("if **in != nil {\n", nil)
sw.Do("in, out := *in, *out\n", nil)
g.generateFor(uet, sw)
sw.Do("}\n", nil)
case uet.Kind == types.Struct:
sw.Do("*out = new($.Elem|raw$)\n", ut)
sw.Do("(*in).DeepCopyInto(*out)\n", nil)
default:
klog.Fatalf("Hit an unsupported type %v for %v", uet, t)
}
}

110
vendor/k8s.io/code-generator/cmd/deepcopy-gen/main.go generated vendored Normal file
View File

@@ -0,0 +1,110 @@
/*
Copyright 2015 The Kubernetes 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.
*/
// deepcopy-gen is a tool for auto-generating DeepCopy functions.
//
// Given a list of input directories, it will generate DeepCopy and
// DeepCopyInto methods that efficiently perform a full deep-copy of each type.
// If these methods already exist (are predefined by the developer), they are
// used instead of generating new ones. Generated code will use standard value
// assignment whenever possible. If that is not possible it will try to call
// its own generated copy function for the type. Failing that, it will fall
// back on `conversion.Cloner.DeepCopy(val)` to make the copy. The resulting
// file will be stored in the same directory as the processed source package.
//
// If interfaces are referenced in types, it is expected that corresponding
// DeepCopyInterfaceName methods exist, e.g. DeepCopyObject for runtime.Object.
// These can be predefined by the developer or generated through tags, see
// below. They must be added to the interfaces themselves manually, e.g.
//
// type Object interface {
// ...
// DeepCopyObject() Object
// }
//
// Generation is governed by comment tags in the source. Any package may
// request DeepCopy generation by including a comment in the file-comments of
// one file, of the form:
//
// // +k8s:deepcopy-gen=package
//
// DeepCopy functions can be generated for individual types, rather than the
// entire package by specifying a comment on the type definition of the form:
//
// // +k8s:deepcopy-gen=true
//
// When generating for a whole package, individual types may opt out of
// DeepCopy generation by specifying a comment on the type definition of the
// form:
//
// // +k8s:deepcopy-gen=false
//
// Additional DeepCopyInterfaceName methods can be generated by specifying a
// comment on the type definition of the form:
//
// // +k8s:deepcopy-gen:interfaces=k8s.io/kubernetes/runtime.Object,k8s.io/kubernetes/runtime.List
//
// This leads to the generation of DeepCopyObject and DeepCopyList with the given
// interfaces as return types. We say that the tagged type implements deepcopy for the
// interfaces.
//
// The deepcopy funcs for interfaces using "+k8s:deepcopy-gen:interfaces" use the pointer
// of the type as receiver. For those special cases where the non-pointer object should
// implement the interface, this can be done with:
//
// // +k8s:deepcopy-gen:nonpointer-interfaces=true
package main
import (
"flag"
"github.com/spf13/pflag"
"k8s.io/code-generator/cmd/deepcopy-gen/args"
"k8s.io/code-generator/cmd/deepcopy-gen/generators"
"k8s.io/gengo/v2"
"k8s.io/gengo/v2/generator"
"k8s.io/klog/v2"
)
func main() {
klog.InitFlags(nil)
args := args.New()
args.AddFlags(pflag.CommandLine)
flag.Set("logtostderr", "true")
pflag.CommandLine.AddGoFlagSet(flag.CommandLine)
pflag.Parse()
if err := args.Validate(); err != nil {
klog.Fatalf("Error: %v", err)
}
myTargets := func(context *generator.Context) []generator.Target {
return generators.GetTargets(context, args)
}
// Run it.
if err := gengo.Execute(
generators.NameSystems(),
generators.DefaultNameSystem(),
myTargets,
gengo.StdBuildTag,
pflag.Args(),
); err != nil {
klog.Fatalf("Error: %v", err)
}
klog.V(2).Info("Completed successfully.")
}

92
vendor/k8s.io/code-generator/pkg/util/comments.go generated vendored Normal file
View File

@@ -0,0 +1,92 @@
/*
Copyright 2025 The Kubernetes 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.
*/
package util
import (
"fmt"
"k8s.io/gengo/v2"
)
// ExtractCommentTagsWithoutArguments parses comments for special metadata tags. The
// marker argument should be unique enough to identify the tags needed, and
// should not be a marker for tags you don't want, or else the caller takes
// responsibility for making that distinction.
//
// The tagNames argument is a list of specific tags being extracted. If this is
// nil or empty, all lines which match the marker are considered. If this is
// specified, only lines with begin with marker + one of the tags will be
// considered. This is useful when a common marker is used which may match
// lines which fail this syntax (e.g. which predate this definition).
//
// This function looks for input lines of the following forms:
// - 'marker' + "key=value"
// - 'marker' + "key()=value"
// - 'marker' + "key(arg)=value"
//
// The arg is forbidden. This function only consider tags with no arguments specified
// (either as "key=value" or as // "key()=value"). Finding tags with an argument will
// result in an error.
//
// The value is optional. If not specified, the resulting Tag will have "" as
// the value.
//
// Tag comment-lines may have a trailing end-of-line comment.
//
// The map returned here is keyed by the Tag's name without args.
//
// A tag can be specified more than one time and all values are returned. If
// the resulting map has an entry for a key, the value (a slice) is guaranteed
// to have at least 1 element.
//
// Example: if you pass "+" for 'marker', and the following lines are in
// the comments:
//
// +foo=val1 // foo
// +bar
// +foo=val2 // also foo
// +foo()=val3 // still foo
// +baz="qux"
//
// Then this function will return:
//
// map[string][]string{"foo":{"val1", "val2", "val3"}, "bar": {""}, "baz": {`"qux"`}}
func ExtractCommentTagsWithoutArguments(marker string, tagNames []string, lines []string) (map[string][]string, error) {
functionStyleTags, err := gengo.ExtractFunctionStyleCommentTags(marker, tagNames, lines)
if err != nil {
return nil, err
}
out := make(map[string][]string)
for tagName, tags := range functionStyleTags {
values := make([]string, 0)
for _, tag := range tags {
if tag.Args == nil {
values = append(values, tag.Value)
} else {
return nil, fmt.Errorf(`failed to parse tag %s: expected no arguments, found "%s"`, tag, tag.Args[0])
}
}
if len(values) > 0 {
out[tagName] = values
}
}
return out, nil
}

View File

@@ -0,0 +1,37 @@
/*
Copyright 2017 The Kubernetes 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.
*/
package util
import (
"fmt"
"strings"
)
// PluralExceptionListToMapOrDie converts the list in "Type:PluralType" to map[string]string.
// This is used for pluralizer.
// If the format is wrong, this function will panic.
func PluralExceptionListToMapOrDie(pluralExceptions []string) map[string]string {
pluralExceptionMap := make(map[string]string, len(pluralExceptions))
for i := range pluralExceptions {
parts := strings.Split(pluralExceptions[i], ":")
if len(parts) != 2 {
panic(fmt.Sprintf("invalid plural exception definition: %s", pluralExceptions[i]))
}
pluralExceptionMap[parts[0]] = parts[1]
}
return pluralExceptionMap
}

202
vendor/k8s.io/gengo/v2/LICENSE generated vendored Normal file
View File

@@ -0,0 +1,202 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2014 The Kubernetes 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.

14
vendor/k8s.io/gengo/v2/Makefile generated vendored Normal file
View File

@@ -0,0 +1,14 @@
all:
go build ./...
test:
GODEBUG=gotypesalias=0 go test -race ./... -count=1
GODEBUG=gotypesalias=1 go test -race ./... -count=1
# We verify for the maximum version of the go directive as 1.20
# here because the oldest go directive that exists on our supported
# release branches in k/k is 1.20.
verify:
GODEBUG=gotypesalias=0 ./hack/verify-examples.sh
GODEBUG=gotypesalias=1 ./hack/verify-examples.sh
./hack/verify-go-directive.sh 1.20

53
vendor/k8s.io/gengo/v2/README.md generated vendored Normal file
View File

@@ -0,0 +1,53 @@
[![GoDoc Widget]][GoDoc] [![GoReport]][GoReportStatus]
[GoDoc]: https://godoc.org/k8s.io/gengo
[GoDoc Widget]: https://godoc.org/k8s.io/gengo?status.svg
[GoReport]: https://goreportcard.com/badge/github.com/kubernetes/gengo
[GoReportStatus]: https://goreportcard.com/report/github.com/kubernetes/gengo
# Gengo: a framework for building simple code generators
This repo is used by Kubernetes to build some codegen tooling. It is not
intended to be general-purpose and makes some assumptions that may not hold
outside of Kubernetes.
In the past this repo was partially supported for external use (outside of the
Kubernetes project overall), but that is no longer true. We may change the API
in incompatible ways, without warning.
If you are not building something that is part of Kubernetes, DO NOT DEPEND ON
THIS REPO.
## New usage within Kubernetes
Gengo is a very opinionated framework. It is primarily aimed at generating Go
code derived from types defined in other Go code, but it is possible to use it
for other things (e.g. proto files). Net new tools should consider using
`golang.org/x/tools/go/packages` directly. Gengo can serve as an example of
how to do that.
If you still decide you want to use gengo, see the
[simple examples](./examples) in this repo or the more extensive tools in the
Kubernetes [code-generator](https://github.com/kubernetes/code-generator/)
repo.
## Overview
Gengo is used to build tools (generally a tool is a binary). Each tool
describes some number of `Targets`. A target is a single output package, which
may be the same as the inputs (if the tool generates code alongside the inputs)
or different. Each `Target` describes some number of `Generators`. A
generator is responsible for emitting a single file into the target directory.
Gengo helps the tool to load and process input packages, e.g. extracting type
information and associating comments. Each target will be offered every known
type, and can filter that down to the set of types it cares about. Each
generator will be offered the result of the target's filtering, and can filter
the set of types further. Finally, the generator will be called to emit code
for all of the remaining types.
The `tracer` example in this repo can be used to examine all of the hooks.
## Contributing
Please see [CONTRIBUTING.md](../CONTRIBUTING.md) for instructions on how to contribute.

85
vendor/k8s.io/gengo/v2/codetags/extractor.go generated vendored Normal file
View File

@@ -0,0 +1,85 @@
/*
Copyright 2025 The Kubernetes 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.
*/
package codetags
import (
"strings"
"unicode/utf8"
)
// Extract identifies and collects lines containing special metadata tags.
// It processes only lines that begin with the prefix.
//
// The portion of a line immediately following the prefix is treated as
// a potential tag name. To be considered valid, this tag name must
// match the regular expression `[a-zA-Z_][a-zA-Z0-9_.-:]*`.
//
// Extract returns a map where each key is a valid tag name found in
// lines that begin with the prefix.
// The value for each key is a slice of strings. Each string in this slice
// represents the contents of an original line after the prefix has been removed.
//
// Example: When called with prefix "+k8s:", lines:
//
// Comment line without marker
// +k8s:noArgs # comment
// +withValue=value1
// +withValue=value2
// +k8s:withArg(arg1)=value1
// +k8s:withArg(arg2)=value2 # comment
// +k8s:withNamedArgs(arg1=value1, arg2=value2)=value
//
// Then this function will return:
//
// map[string][]string{
// "noArgs": {"noArgs # comment"},
// "withArg": {"withArg(arg1)=value1", "withArg(arg2)=value2 # comment"},
// "withNamedArgs": {"withNamedArgs(arg1=value1, arg2=value2)=value"},
// }
func Extract(prefix string, lines []string) map[string][]string {
out := map[string][]string{}
for _, line := range lines {
line = strings.TrimLeft(line, " \t")
if !strings.HasPrefix(line, prefix) {
continue
}
line = line[len(prefix):]
// Find the end of the presumed tag name.
nameEnd := findNameEnd(line)
name := line[:nameEnd]
out[name] = append(out[name], line)
}
return out
}
// findNameEnd matches a tag in the same way as the parser.
func findNameEnd(s string) int {
if len(s) == 0 {
return 0
}
if r, _ := utf8.DecodeRuneInString(s); !isIdentBegin(r) {
return 0
}
idx := strings.IndexFunc(s, func(r rune) bool {
return !(isTagNameInterior(r))
})
if idx == -1 {
return len(s)
}
return idx
}

407
vendor/k8s.io/gengo/v2/codetags/parser.go generated vendored Normal file
View File

@@ -0,0 +1,407 @@
/*
Copyright 2025 The Kubernetes 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.
*/
package codetags
import (
"fmt"
"strings"
"unicode"
)
// Parse parses a tag string into a Tag, or returns an error if the tag
// string fails to parse.
//
// ParseOption may be provided to modify the behavior of the parser. The below
// describes the default behavior.
//
// A tag consists of a name, optional arguments, and an optional scalar value or
// tag value. For example,
//
// "name"
// "name=50"
// "name("featureX")=50"
// "name(limit: 10, path: "/xyz")=text value"
// "name(limit: 10, path: "/xyz")=+anotherTag(size: 100)"
//
// Arguments are optional and may be either:
// - A single positional argument.
// - One or more named arguments (in the format `name: value`).
// - (Positional and named arguments cannot be mixed.)
//
// For example,
//
// "name()"
// "name(arg)"
// "name(namedArg1: argValue1)"
// "name(namedArg1: argValue1, namedArg2: argValue2)"
//
// Argument values may be strings, ints, booleans, or identifiers.
//
// For example,
//
// "name("double-quoted")"
// "name(`backtick-quoted`)"
// "name(100)"
// "name(true)"
// "name(arg1: identifier)"
// "name(arg1:`string value`)"
// "name(arg1: 100)"
// "name(arg1: true)"
//
// Note: When processing Go source code comments, the Extract function is
// typically used first to find and isolate tag strings matching a specific
// prefix. Those extracted strings can then be parsed using this function.
//
// The value part of the tag is optional and follows an equals sign "=". If a
// value is present, it must be a string, int, boolean, identifier, or tag.
//
// For example,
//
// "name" # no value
// "name=identifier"
// "name="double-quoted value""
// "name=`backtick-quoted value`"
// "name(100)"
// "name(true)"
// "name=+anotherTag"
// "name=+anotherTag(size: 100)"
//
// Trailing comments are ignored unless the RawValues option is enabled, in which
// case they are treated as part of the value.
//
// For example,
//
// "key=value # This comment is ignored"
//
// Formal Grammar:
//
// <tag> ::= <tagName> [ "(" [ <args> ] ")" ] [ ( "=" <value> | "=+" <tag> ) ]
// <args> ::= <value> | <namedArgs>
// <namedArgs> ::= <argNameAndValue> [ "," <namedArgs> ]*
// <argNameAndValue> ::= <identifier> ":" <value>
// <value> ::= <identifier> | <string> | <int> | <bool>
//
// <tagName> ::= [a-zA-Z_][a-zA-Z0-9_-.:]*
// <identifier> ::= [a-zA-Z_][a-zA-Z0-9_-.]*
// <string> ::= /* Go-style double-quoted or backtick-quoted strings,
// ... with standard Go escape sequences for double-quoted strings. */
// <int> ::= /* Standard Go integer literals (decimal, 0x hex, 0o octal, 0b binary),
// ... with an optional +/- prefix. */
// <bool> ::= "true" | "false"
func Parse(tag string, options ...ParseOption) (Tag, error) {
opts := parseOpts{}
for _, o := range options {
o(&opts)
}
tag = strings.TrimSpace(tag)
return parseTag(tag, opts)
}
// ParseAll calls Parse on each tag in the input slice.
func ParseAll(tags []string, options ...ParseOption) ([]Tag, error) {
var out []Tag
for _, tag := range tags {
parsed, err := Parse(tag, options...)
if err != nil {
return nil, err
}
out = append(out, parsed)
}
return out, nil
}
type parseOpts struct {
rawValues bool
}
// ParseOption provides a parser option.
type ParseOption func(*parseOpts)
// RawValues skips parsing of the value part of the tag. If enabled, the Value
// in the parse response will contain all text following the "=" sign, up to the last
// non-whitespace character, and ValueType will be set to ValueTypeRaw.
// Default: disabled
func RawValues(enabled bool) ParseOption {
return func(opts *parseOpts) {
opts.rawValues = enabled
}
}
func parseTag(input string, opts parseOpts) (Tag, error) {
const (
stTag = "stTag"
stMaybeArgs = "stMaybeArgs"
stArg = "stArg"
stArgEndOfToken = "stArgEndOfToken"
stMaybeValue = "stMaybeValue"
stValue = "stValue"
stMaybeComment = "stMaybeComment"
)
var startTag, endTag *Tag // both ends of the chain when parsing chained tags
// accumulators
var tagName string // current tag name
var value string // current value
var valueType ValueType // current value type
cur := Arg{} // current argument
var args []Arg // current arguments slice
s := scanner{buf: []rune(input)} // scanner for parsing the tag string
var incomplete bool // tracks if a token is incomplete
// These are defined outside the loop to make errors easier.
saveArg := func(v string, t ArgType) {
cur.Value = v
cur.Type = t
args = append(args, cur)
cur = Arg{}
}
saveInt := func(v string) { saveArg(v, ArgTypeInt) }
saveString := func(v string) { saveArg(v, ArgTypeString) }
saveBoolOrString := func(value string) {
if value == "true" || value == "false" {
saveArg(value, ArgTypeBool)
} else {
saveArg(value, ArgTypeString)
}
}
saveName := func(value string) {
cur.Name = value
}
saveTag := func() error {
usingNamedArgs := false
for i, arg := range args {
if (usingNamedArgs && arg.Name == "") || (!usingNamedArgs && arg.Name != "" && i > 0) {
return fmt.Errorf("can't mix named and positional arguments")
}
if arg.Name != "" {
usingNamedArgs = true
}
}
if !usingNamedArgs && len(args) > 1 {
return fmt.Errorf("multiple arguments must use 'name: value' syntax")
}
newTag := &Tag{Name: tagName, Args: args}
if startTag == nil {
startTag = newTag
endTag = newTag
} else {
endTag.ValueTag = newTag
endTag.ValueType = ValueTypeTag
endTag = newTag
}
args = nil // Reset to nil instead of empty slice
return nil
}
saveValue := func() {
endTag.Value = value
endTag.ValueType = valueType
}
var err error
st := stTag
parseLoop:
for r := s.peek(); r != EOF; r = s.peek() {
switch st {
case stTag: // Any leading whitespace is expected to be trimmed before parsing.
switch {
case isIdentBegin(r):
tagName, err = s.nextIdent(isTagNameInterior)
if err != nil {
return Tag{}, err
}
st = stMaybeArgs
default:
break parseLoop
}
case stMaybeArgs:
switch {
case r == '(':
s.next() // consume (
incomplete = true
st = stArg
case r == '=':
s.next() // consume =
if opts.rawValues {
// only raw values support empty values following =
valueType = ValueTypeRaw
} else {
incomplete = true
}
st = stValue
default:
st = stMaybeComment
}
case stArg:
switch {
case r == ')':
s.next() // consume )
incomplete = false
st = stMaybeValue
case r == '-' || r == '+' || unicode.IsDigit(r):
number, err := s.nextNumber()
if err != nil {
return Tag{}, err
}
saveInt(number)
st = stArgEndOfToken
case r == '"' || r == '`':
str, err := s.nextString()
if err != nil {
return Tag{}, err
}
saveString(str)
st = stArgEndOfToken
case isIdentBegin(r):
identifier, err := s.nextIdent(isIdentInterior)
if err != nil {
return Tag{}, err
}
r = s.peek() // reset r after nextIdent
switch {
case r == ',' || r == ')': // positional arg
if r == ',' {
r = s.skipWhitespace() // allow whitespace after ,
}
saveBoolOrString(identifier)
st = stArgEndOfToken
case r == ':': // named arg
s.next() // consume :
r = s.skipWhitespace() // allow whitespace after :
saveName(identifier)
st = stArg
default:
break parseLoop
}
default:
break parseLoop
}
case stArgEndOfToken:
switch {
case r == ',':
s.next() // consume ,
r = s.skipWhitespace() // allow whitespace after ,
st = stArg
case r == ')':
s.next() // consume )
incomplete = false
st = stMaybeValue
default:
break parseLoop
}
case stMaybeValue:
switch {
case r == '=':
s.next() // consume =
if opts.rawValues {
// Empty values are allowed for raw.
// Since = might be the last char in the input, we need
// to record the valueType as raw immediately.
valueType = ValueTypeRaw
}
st = stValue
default:
st = stMaybeComment
}
case stValue:
switch {
case opts.rawValues: // When enabled, consume all remaining chars
incomplete = false
value = s.remainder()
break parseLoop
case r == '+' && isIdentBegin(s.peekN(1)): // tag value
incomplete = false
s.next() // consume +
if err := saveTag(); err != nil {
return Tag{}, err
}
st = stTag
case r == '-' || r == '+' || unicode.IsDigit(r):
incomplete = false
number, err := s.nextNumber()
valueType = ValueTypeInt
if err != nil {
return Tag{}, err
}
value = number
st = stMaybeComment
case r == '"' || r == '`':
incomplete = false
str, err := s.nextString()
if err != nil {
return Tag{}, err
}
value = str
valueType = ValueTypeString
st = stMaybeComment
case isIdentBegin(r):
incomplete = false
str, err := s.nextIdent(isIdentInterior)
if err != nil {
return Tag{}, err
}
value = str
if str == "true" || str == "false" {
valueType = ValueTypeBool
} else {
valueType = ValueTypeString
}
st = stMaybeComment
default:
break parseLoop
}
case stMaybeComment:
switch {
case s.nextIsTrailingComment():
s.remainder()
default:
break parseLoop
}
default:
return Tag{}, fmt.Errorf("unexpected internal parser error: unknown state: %s at position %d", st, s.pos)
}
}
if s.peek() != EOF {
return Tag{}, fmt.Errorf("unexpected character %q at position %d", s.next(), s.pos)
}
if incomplete {
return Tag{}, fmt.Errorf("unexpected end of input")
}
if err := saveTag(); err != nil {
return Tag{}, err
}
if len(valueType) > 0 {
saveValue()
}
if startTag == nil {
return Tag{}, fmt.Errorf("unexpected internal parser error: no tags parsed")
}
return *startTag, nil
}
func isIdentBegin(r rune) bool {
return unicode.IsLetter(r) || r == '_'
}
func isIdentInterior(r rune) bool {
return unicode.IsLetter(r) || unicode.IsDigit(r) || r == '_' || r == '.' || r == '-'
}
func isTagNameInterior(r rune) bool {
return isIdentInterior(r) || r == ':'
}

228
vendor/k8s.io/gengo/v2/codetags/scanner.go generated vendored Normal file
View File

@@ -0,0 +1,228 @@
/*
Copyright 2025 The Kubernetes 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.
*/
package codetags
import (
"bytes"
"fmt"
"strconv"
"strings"
"unicode"
)
type scanner struct {
buf []rune
pos int
}
func (s *scanner) next() rune {
if s.pos >= len(s.buf) {
return EOF
}
r := s.buf[s.pos]
s.pos++
return r
}
func (s *scanner) peek() rune {
return s.peekN(0)
}
func (s *scanner) peekN(n int) rune {
if s.pos+n >= len(s.buf) {
return EOF
}
return s.buf[s.pos+n]
}
func (s *scanner) skipWhitespace() rune {
for r := s.peek(); unicode.IsSpace(r); r = s.peek() {
s.next()
}
return s.peek()
}
func (s *scanner) remainder() string {
result := string(s.buf[s.pos:])
s.pos = len(s.buf)
return result
}
const (
EOF = -1
)
func (s *scanner) nextIsTrailingComment() bool {
i := 0
for ; unicode.IsSpace(s.peekN(i)); i++ {
}
return s.peekN(i) == '#'
}
func (s *scanner) nextNumber() (string, error) {
const (
stBegin = "stBegin"
stPrefix = "stPrefix"
stPosNeg = "stPosNeg"
stNumber = "stNumber"
)
var buf bytes.Buffer
st := stBegin
parseLoop:
for r := s.peek(); r != EOF; r = s.peek() {
switch st {
case stBegin:
switch {
case r == '0':
buf.WriteRune(s.next())
st = stPrefix
case r == '+' || r == '-':
buf.WriteRune(s.next())
st = stPosNeg
case unicode.IsDigit(r):
buf.WriteRune(s.next())
st = stNumber
default:
break parseLoop
}
case stPosNeg:
switch {
case r == '0':
buf.WriteRune(s.next())
st = stPrefix
case unicode.IsDigit(r):
buf.WriteRune(s.next())
st = stNumber
default:
break parseLoop
}
case stPrefix:
switch {
case unicode.IsDigit(r):
buf.WriteRune(s.next())
st = stNumber
case r == 'x' || r == 'o' || r == 'b':
buf.WriteRune(s.next())
st = stNumber
default:
break parseLoop
}
case stNumber:
const hexits = "abcdefABCDEF"
switch {
case unicode.IsDigit(r) || strings.Contains(hexits, string(r)):
buf.WriteRune(s.next())
default:
break parseLoop
}
default:
return "", fmt.Errorf("unexpected internal parser error: unknown state: %s at position %d", st, s.pos)
}
}
numStr := buf.String()
if _, err := strconv.ParseInt(numStr, 0, 64); err != nil {
return "", fmt.Errorf("invalid number %q at position %d", numStr, s.pos)
}
return numStr, nil
}
func (s *scanner) nextString() (string, error) {
const (
stBegin = "stBegin"
stQuotedString = "stQuotedString"
stEscape = "stEscape"
)
var buf bytes.Buffer
var quote rune
var incomplete bool
st := stBegin
parseLoop:
for r := s.peek(); r != EOF; r = s.peek() {
switch st {
case stBegin:
switch {
case r == '"' || r == '`':
incomplete = true
quote = s.next() // consume quote
st = stQuotedString
default:
return "", fmt.Errorf("expected string at position %d", s.pos)
}
case stQuotedString:
switch {
case r == '\\':
s.next() // consume escape
st = stEscape
case r == quote:
incomplete = false
s.next()
break parseLoop
default:
buf.WriteRune(s.next())
}
case stEscape:
switch {
case r == quote || r == '\\':
buf.WriteRune(s.next())
st = stQuotedString
default:
return "", fmt.Errorf("unhandled escaped character %q", r)
}
default:
return "", fmt.Errorf("unexpected internal parser error: unknown state: %s at position %d", st, s.pos)
}
}
if incomplete {
return "", fmt.Errorf("unterminated string at position %d", s.pos)
}
return buf.String(), nil
}
func (s *scanner) nextIdent(isInteriorChar func(r rune) bool) (string, error) {
const (
stBegin = "stBegin"
stInterior = "stInterior"
)
var buf bytes.Buffer
st := stBegin
parseLoop:
for r := s.peek(); r != EOF; r = s.peek() {
switch st {
case stBegin:
switch {
case isIdentBegin(r):
buf.WriteRune(s.next())
st = stInterior
default:
return "", fmt.Errorf("expected identifier at position %d", s.pos)
}
case stInterior:
switch {
case isInteriorChar(r):
buf.WriteRune(s.next())
default:
break parseLoop
}
default:
return "", fmt.Errorf("unexpected internal parser error: unknown state: %s at position %d", st, s.pos)
}
}
return buf.String(), nil
}

169
vendor/k8s.io/gengo/v2/codetags/types.go generated vendored Normal file
View File

@@ -0,0 +1,169 @@
/*
Copyright 2025 The Kubernetes 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.
*/
package codetags
import (
"strconv"
"strings"
)
// Tag represents a single comment tag with typed args.
type Tag struct {
// Name is the name of the tag with no arguments.
Name string
// Args is a list of optional arguments to the tag.
Args []Arg
// Value is the string representation of the tag value.
// Provides the tag value when ValueType is ValueTypeString, ValueTypeBool, ValueTypeInt or ValueTypeRaw.
Value string
// ValueTag is another tag parsed from the value of this tag.
// Provides the tag value when ValueType is ValueTypeTag.
ValueTag *Tag
// ValueType is the type of the value.
ValueType ValueType
}
// PositionalArg returns the positional argument. If there is no positional
// argument, it returns false.
func (t Tag) PositionalArg() (Arg, bool) {
if len(t.Args) == 0 || len(t.Args[0].Name) > 0 {
return Arg{}, false
}
return t.Args[0], true
}
// NamedArg returns the named argument. If o named argument is found, it returns
// false. Always returns false for empty name; use PositionalArg instead.
func (t Tag) NamedArg(name string) (Arg, bool) {
if len(name) == 0 {
return Arg{}, false
}
for _, arg := range t.Args {
if arg.Name == name {
return arg, true
}
}
return Arg{}, false
}
// String returns the canonical string representation of the tag.
// All strings are represented in double quotes. Spacing is normalized.
func (t Tag) String() string {
buf := strings.Builder{}
buf.WriteString(t.Name)
if len(t.Args) > 0 {
buf.WriteString("(")
for i, a := range t.Args {
if i > 0 {
buf.WriteString(", ")
}
buf.WriteString(a.String())
}
buf.WriteString(")")
}
if t.ValueType != ValueTypeNone {
if t.ValueType == ValueTypeTag {
buf.WriteString("=+")
buf.WriteString(t.ValueTag.String())
} else {
buf.WriteString("=")
if t.ValueType == ValueTypeString {
buf.WriteString(strconv.Quote(t.Value))
} else {
buf.WriteString(t.Value)
}
}
}
return buf.String()
}
// Arg represents a argument.
type Arg struct {
// Name is the name of a named argument. This is zero-valued for positional arguments.
Name string
// Value is the string value of an argument. It has been validated to match the Type.
// See the ArgType const godoc for further details on how to parse the value for the
// Type.
Value string
// Type identifies the type of the argument.
Type ArgType
}
func (a Arg) String() string {
buf := strings.Builder{}
if len(a.Name) > 0 {
buf.WriteString(a.Name)
buf.WriteString(": ")
}
if a.Type == ArgTypeString {
buf.WriteString(strconv.Quote(a.Value))
} else {
buf.WriteString(a.Value)
}
return buf.String()
}
// ArgType is an argument's type.
type ArgType string
const (
// ArgTypeString identifies string values.
ArgTypeString ArgType = "string"
// ArgTypeInt identifies int values. Values of this type may be in decimal,
// octal, hex or binary string representations. Consider using strconv.ParseInt
// to parse, as it supports all these string representations.
ArgTypeInt ArgType = "int"
// ArgTypeBool identifies bool values. Values of this type must either be the
// string "true" or "false".
ArgTypeBool ArgType = "bool"
)
// ValueType is a tag's value type.
type ValueType string
const (
// ValueTypeNone indicates that the tag has no value.
ValueTypeNone ValueType = ""
// ValueTypeString identifies string values.
ValueTypeString ValueType = "string"
// ValueTypeInt identifies int values. Values of this type may be in decimal,
// octal, hex or binary string representations. Consider using strconv.ParseInt
// to parse, as it supports all these string representations.
ValueTypeInt ValueType = "int"
// ValueTypeBool identifies bool values. Values of this type must either be the
// string "true" or "false".
ValueTypeBool ValueType = "bool"
// ValueTypeTag identifies that the value is another tag.
ValueTypeTag ValueType = "tag"
// ValueTypeRaw identifies that the value is raw, untyped content and contains
// all text from the tag declaration following the "=" sign, up to the last
// non-whitespace character.
ValueTypeRaw ValueType = "raw"
)

194
vendor/k8s.io/gengo/v2/comments.go generated vendored Normal file
View File

@@ -0,0 +1,194 @@
/*
Copyright 2015 The Kubernetes 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.
*/
package gengo
import (
"bytes"
"fmt"
"slices"
"strings"
"k8s.io/gengo/v2/codetags"
)
// ExtractCommentTags parses comments for lines of the form:
//
// 'marker' + "key=value".
//
// Values are optional; "" is the default. A tag can be specified more than
// one time and all values are returned. If the resulting map has an entry for
// a key, the value (a slice) is guaranteed to have at least 1 element.
//
// Example: if you pass "+" for 'marker', and the following lines are in
// the comments:
//
// +foo=value1
// +bar
// +foo=value2
// +baz="qux"
//
// Then this function will return:
//
// map[string][]string{"foo":{"value1, "value2"}, "bar": {""}, "baz": {`"qux"`}}
//
// Deprecated: Prefer codetags.Extract and codetags.Parse.
func ExtractCommentTags(marker string, lines []string) map[string][]string {
out := map[string][]string{}
for _, line := range lines {
line = strings.Trim(line, " ")
if len(line) == 0 {
continue
}
if !strings.HasPrefix(line, marker) {
continue
}
kv := strings.SplitN(line[len(marker):], "=", 2)
if len(kv) == 2 {
out[kv[0]] = append(out[kv[0]], kv[1])
} else if len(kv) == 1 {
out[kv[0]] = append(out[kv[0]], "")
}
}
return out
}
// ExtractSingleBoolCommentTag parses comments for lines of the form:
//
// 'marker' + "key=value1"
//
// If the tag is not found, the default value is returned. Values are asserted
// to be boolean ("true" or "false"), and any other value will cause an error
// to be returned. If the key has multiple values, the first one will be used.
//
// This function is a wrapper around codetags.Extract and codetags.Parse, but only supports tags with
// a single position arg of type string, and a value of type bool.
func ExtractSingleBoolCommentTag(marker string, key string, defaultVal bool, lines []string) (bool, error) {
tags, err := ExtractFunctionStyleCommentTags(marker, []string{key}, lines, ParseValues(true))
if err != nil {
return false, err
}
values := tags[key]
if values == nil {
return defaultVal, nil
}
if values[0].Value == "true" {
return true, nil
}
if values[0].Value == "false" {
return false, nil
}
return false, fmt.Errorf("tag value for %q is not boolean: %q", key, values[0])
}
// ExtractFunctionStyleCommentTags parses comments for special metadata tags.
//
// This function is a wrapper around codetags.Extract and codetags.Parse, but only supports tags with
// a single position arg of type string.
func ExtractFunctionStyleCommentTags(marker string, tagNames []string, lines []string, options ...TagOption) (map[string][]Tag, error) {
opts := tagOpts{}
for _, o := range options {
o(&opts)
}
out := map[string][]Tag{}
tags := codetags.Extract(marker, lines)
for tagName, tagLines := range tags {
if len(tagNames) > 0 && !slices.Contains(tagNames, tagName) {
continue
}
for _, line := range tagLines {
typedTag, err := codetags.Parse(line, codetags.RawValues(!opts.parseValues))
if err != nil {
return nil, err
}
tag, err := toStringArgs(typedTag)
if err != nil {
return nil, err
}
out[tagName] = append(out[tagName], tag)
}
}
return out, nil
}
// TagOption provides an option for extracting tags.
type TagOption func(opts *tagOpts)
// ParseValues enables parsing of tag values. When enabled, tag values must
// be valid quoted strings, ints, booleans, identifiers, or tags. Otherwise, a
// parse error will be returned. Also, when enabled, trailing comments are
// ignored.
// Default: disabled
func ParseValues(enabled bool) TagOption {
return func(opts *tagOpts) {
opts.parseValues = enabled
}
}
type tagOpts struct {
parseValues bool
}
func toStringArgs(tag codetags.Tag) (Tag, error) {
var stringArgs []string
if len(tag.Args) > 1 {
return Tag{}, fmt.Errorf("expected one argument, got: %v", tag.Args)
}
for _, arg := range tag.Args {
if len(arg.Name) > 0 {
return Tag{}, fmt.Errorf("unexpected named argument: %q", arg.Name)
}
if arg.Type != codetags.ArgTypeString {
return Tag{}, fmt.Errorf("unexpected argument type: %s", arg.Type)
} else {
stringArgs = append(stringArgs, arg.Value)
}
}
return Tag{
Name: tag.Name,
Args: stringArgs,
Value: tag.Value,
}, nil
}
// Tag represents a single comment tag.
type Tag struct {
// Name is the name of the tag with no arguments.
Name string
// Args is a list of optional arguments to the tag.
Args []string
// Value is the value of the tag.
Value string
}
func (t Tag) String() string {
buf := bytes.Buffer{}
buf.WriteString(t.Name)
if len(t.Args) > 0 {
buf.WriteString("(")
for i, a := range t.Args {
if i > 0 {
buf.WriteString(", ")
}
buf.WriteString(a)
}
buf.WriteString(")")
}
return buf.String()
}

98
vendor/k8s.io/gengo/v2/execute.go generated vendored Normal file
View File

@@ -0,0 +1,98 @@
/*
Copyright 2015 The Kubernetes 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.
*/
// Package gengo is a code-generation framework.
package gengo
import (
"bytes"
"fmt"
"os"
"path/filepath"
"strconv"
"strings"
"time"
"k8s.io/gengo/v2/generator"
"k8s.io/gengo/v2/namer"
"k8s.io/gengo/v2/parser"
)
// StdBuildTag is a suggested build-tag which tools can use both as an argument
// to GoBoilerplate and to Execute.
const StdBuildTag = "ignore_autogenerated"
// StdGeneratedBy is a suggested "generated by" line which tools can use as an
// argument to GoBoilerplate.
const StdGeneratedBy = "// Code generated by GENERATOR_NAME. DO NOT EDIT."
// GoBoilerplate returns the Go file header:
// - an optional build tag (negative, set it to ignore generated code)
// - an optional boilerplate file
// - an optional "generated by" comment
func GoBoilerplate(headerFile, buildTag, generatedBy string) ([]byte, error) {
buf := bytes.Buffer{}
if buildTag != "" {
buf.WriteString(
fmt.Sprintf("//go:build !%s\n// +build !%s\n\n", buildTag, buildTag))
}
if headerFile != "" {
b, err := os.ReadFile(headerFile)
if err != nil {
return nil, err
}
b = bytes.ReplaceAll(b, []byte("YEAR"), []byte(strconv.Itoa(time.Now().UTC().Year())))
buf.Write(b)
buf.WriteByte('\n')
}
if generatedBy != "" {
generatorName := filepath.Base(os.Args[0])
// Strip the extension from the name to normalize output between *nix and Windows.
generatorName = generatorName[:len(generatorName)-len(filepath.Ext(generatorName))]
generatedByComment := strings.ReplaceAll(generatedBy, "GENERATOR_NAME", generatorName)
buf.WriteString(fmt.Sprintf("%s\n\n", generatedByComment))
}
return buf.Bytes(), nil
}
// Execute implements most of a tool's main loop.
func Execute(nameSystems namer.NameSystems, defaultSystem string, getTargets func(*generator.Context) []generator.Target, buildTag string, patterns []string) error {
var buildTags []string
if buildTag != "" {
buildTags = append(buildTags, buildTag)
}
p := parser.NewWithOptions(parser.Options{BuildTags: buildTags})
if err := p.LoadPackages(patterns...); err != nil {
return fmt.Errorf("failed making a parser: %v", err)
}
c, err := generator.NewContext(p, nameSystems, defaultSystem)
if err != nil {
return fmt.Errorf("failed making a context: %v", err)
}
targets := getTargets(c)
if err := c.ExecuteTargets(targets); err != nil {
return fmt.Errorf("failed executing generator: %v", err)
}
return nil
}

31
vendor/k8s.io/gengo/v2/generator/doc.go generated vendored Normal file
View File

@@ -0,0 +1,31 @@
/*
Copyright 2015 The Kubernetes 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.
*/
// Package generator defines an interface for code generators to implement.
//
// To use this package, you'll implement the "Package" and "Generator"
// interfaces; you'll call NewContext to load up the types you want to work
// with, and then you'll call one or more of the Execute methods. See the
// interface definitions for explanations. All output will have gofmt called on
// it automatically, so you do not need to worry about generating correct
// indentation.
//
// This package also exposes SnippetWriter. SnippetWriter reduces to a minimum
// the boilerplate involved in setting up a template from go's text/template
// package. Additionally, all naming systems in the Context will be added as
// functions to the parsed template, so that they can be called directly from
// your templates!
package generator // import "k8s.io/gengo/v2/generator"

50
vendor/k8s.io/gengo/v2/generator/error_tracker.go generated vendored Normal file
View File

@@ -0,0 +1,50 @@
/*
Copyright 2015 The Kubernetes 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.
*/
package generator
import (
"io"
)
// ErrorTracker tracks errors to the underlying writer, so that you can ignore
// them until you're ready to return.
type ErrorTracker struct {
io.Writer
err error
}
// NewErrorTracker makes a new error tracker; note that it implements io.Writer.
func NewErrorTracker(w io.Writer) *ErrorTracker {
return &ErrorTracker{Writer: w}
}
// Write intercepts calls to Write.
func (et *ErrorTracker) Write(p []byte) (n int, err error) {
if et.err != nil {
return 0, et.err
}
n, err = et.Writer.Write(p)
if err != nil {
et.err = err
}
return n, err
}
// Error returns nil if no error has occurred, otherwise it returns the error.
func (et *ErrorTracker) Error() error {
return et.err
}

273
vendor/k8s.io/gengo/v2/generator/execute.go generated vendored Normal file
View File

@@ -0,0 +1,273 @@
/*
Copyright 2015 The Kubernetes 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.
*/
package generator
import (
"bytes"
"errors"
"fmt"
"io"
"os"
"path/filepath"
"strings"
"golang.org/x/tools/imports"
"k8s.io/gengo/v2/namer"
"k8s.io/gengo/v2/types"
"k8s.io/klog/v2"
)
// ExecuteTargets runs the generators for the provided targets.
func (c *Context) ExecuteTargets(targets []Target) error {
klog.V(5).Infof("ExecuteTargets: %d targets", len(targets))
var errs []error
for _, tgt := range targets {
if err := c.ExecuteTarget(tgt); err != nil {
errs = append(errs, err)
}
}
if len(errs) > 0 {
return fmt.Errorf("some targets had errors: %w", errors.Join(errs...))
}
return nil
}
type DefaultFileType struct {
Format func([]byte) ([]byte, error)
Assemble func(io.Writer, *File)
}
func (ft DefaultFileType) AssembleFile(f *File, pathname string) error {
klog.V(5).Infof("Assembling file %q", pathname)
destFile, err := os.Create(pathname)
if err != nil {
return err
}
defer destFile.Close()
b := &bytes.Buffer{}
et := NewErrorTracker(b)
ft.Assemble(et, f)
if et.Error() != nil {
return et.Error()
}
if formatted, err := ft.Format(b.Bytes()); err != nil {
err = fmt.Errorf("unable to format file %q (%v)", pathname, err)
// Write the file anyway, so they can see what's going wrong and fix the generator.
if _, err2 := destFile.Write(b.Bytes()); err2 != nil {
return err2
}
return err
} else {
_, err = destFile.Write(formatted)
return err
}
}
func assembleGoFile(w io.Writer, f *File) {
w.Write(f.Header)
fmt.Fprintf(w, "package %v\n\n", f.PackageName)
if len(f.Imports) > 0 {
fmt.Fprint(w, "import (\n")
for i := range f.Imports {
if strings.Contains(i, "\"") {
// they included quotes, or are using the
// `name "path/to/pkg"` format.
fmt.Fprintf(w, "\t%s\n", i)
} else {
fmt.Fprintf(w, "\t%q\n", i)
}
}
fmt.Fprint(w, ")\n\n")
}
if f.Vars.Len() > 0 {
fmt.Fprint(w, "var (\n")
w.Write(f.Vars.Bytes())
fmt.Fprint(w, ")\n\n")
}
if f.Consts.Len() > 0 {
fmt.Fprint(w, "const (\n")
w.Write(f.Consts.Bytes())
fmt.Fprint(w, ")\n\n")
}
w.Write(f.Body.Bytes())
}
func importsWrapper(src []byte) ([]byte, error) {
opt := imports.Options{
Comments: true,
TabIndent: true,
TabWidth: 8,
FormatOnly: true, // Disable the insertion and deletion of imports
}
return imports.Process("", src, &opt)
}
func NewGoFile() *DefaultFileType {
return &DefaultFileType{
Format: importsWrapper,
Assemble: assembleGoFile,
}
}
// format should be one line only, and not end with \n.
func addIndentHeaderComment(b *bytes.Buffer, format string, args ...interface{}) {
if b.Len() > 0 {
fmt.Fprintf(b, "\n// "+format+"\n", args...)
} else {
fmt.Fprintf(b, "// "+format+"\n", args...)
}
}
func (c *Context) filteredBy(f func(*Context, *types.Type) bool) *Context {
c2 := *c
c2.Order = []*types.Type{}
for _, t := range c.Order {
if f(c, t) {
c2.Order = append(c2.Order, t)
}
}
return &c2
}
// make a new context; inheret c.Namers, but add on 'namers'. In case of a name
// collision, the namer in 'namers' wins.
func (c *Context) addNameSystems(namers namer.NameSystems) *Context {
if namers == nil {
return c
}
c2 := *c
// Copy the existing name systems so we don't corrupt a parent context
c2.Namers = namer.NameSystems{}
for k, v := range c.Namers {
c2.Namers[k] = v
}
for name, namer := range namers {
c2.Namers[name] = namer
}
return &c2
}
// ExecuteTarget runs the generators for a single target.
func (c *Context) ExecuteTarget(tgt Target) error {
tgtDir := tgt.Dir()
if tgtDir == "" {
return fmt.Errorf("no directory for target %s", tgt.Path())
}
klog.V(5).Infof("Executing target %q (%q)", tgt.Name(), tgtDir)
// Filter out any types the *package* doesn't care about.
packageContext := c.filteredBy(tgt.Filter)
if err := os.MkdirAll(tgtDir, 0755); err != nil {
return err
}
files := map[string]*File{}
for _, g := range tgt.Generators(packageContext) {
// Filter out types the *generator* doesn't care about.
genContext := packageContext.filteredBy(g.Filter)
// Now add any extra name systems defined by this generator
genContext = genContext.addNameSystems(g.Namers(genContext))
fileType := g.FileType()
if len(fileType) == 0 {
return fmt.Errorf("generator %q must specify a file type", g.Name())
}
f := files[g.Filename()]
if f == nil {
// This is the first generator to reference this file, so start it.
f = &File{
Name: g.Filename(),
FileType: fileType,
PackageName: tgt.Name(),
PackagePath: tgt.Path(),
PackageDir: tgt.Dir(),
Header: tgt.Header(g.Filename()),
Imports: map[string]struct{}{},
}
files[f.Name] = f
} else if f.FileType != g.FileType() {
return fmt.Errorf("file %q already has type %q, but generator %q wants to use type %q", f.Name, f.FileType, g.Name(), g.FileType())
}
if vars := g.PackageVars(genContext); len(vars) > 0 {
addIndentHeaderComment(&f.Vars, "Package-wide variables from generator %q.", g.Name())
for _, v := range vars {
if _, err := fmt.Fprintf(&f.Vars, "%s\n", v); err != nil {
return err
}
}
}
if consts := g.PackageConsts(genContext); len(consts) > 0 {
addIndentHeaderComment(&f.Consts, "Package-wide consts from generator %q.", g.Name())
for _, v := range consts {
if _, err := fmt.Fprintf(&f.Consts, "%s\n", v); err != nil {
return err
}
}
}
if err := genContext.executeBody(&f.Body, g); err != nil {
return err
}
if imports := g.Imports(genContext); len(imports) > 0 {
for _, i := range imports {
f.Imports[i] = struct{}{}
}
}
}
var errs []error
for _, f := range files {
finalPath := filepath.Join(tgtDir, f.Name)
assembler, ok := c.FileTypes[f.FileType]
if !ok {
return fmt.Errorf("the file type %q registered for file %q does not exist in the context", f.FileType, f.Name)
}
if err := assembler.AssembleFile(f, finalPath); err != nil {
errs = append(errs, err)
}
}
if len(errs) > 0 {
return fmt.Errorf("errors in target %q: %w", tgt.Path(), errors.Join(errs...))
}
return nil
}
func (c *Context) executeBody(w io.Writer, generator Generator) error {
et := NewErrorTracker(w)
if err := generator.Init(c, et); err != nil {
return err
}
for _, t := range c.Order {
if err := generator.GenerateType(c, t, et); err != nil {
return err
}
}
if err := generator.Finalize(c, et); err != nil {
return err
}
return et.Error()
}

214
vendor/k8s.io/gengo/v2/generator/generator.go generated vendored Normal file
View File

@@ -0,0 +1,214 @@
/*
Copyright 2015 The Kubernetes 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.
*/
package generator
import (
"bytes"
"io"
"k8s.io/gengo/v2/namer"
"k8s.io/gengo/v2/parser"
"k8s.io/gengo/v2/types"
)
// Target describes a Go package into which code will be generated. A single
// Target may have many Generators, each of which emits one file.
type Target interface {
// Name returns the package short name (as in `package foo`).
Name() string
// Path returns the package import path (as in `import "example.com/foo"`).
Path() string
// Dir returns the location of the resulting package on disk. This may be
// the same directory as an input package (when generating code in-place)
// or a different directory entirely.
Dir() string
// Filter should return true if this package cares about this type.
// Otherwise, this type will be omitted from the type ordering for
// this package.
Filter(*Context, *types.Type) bool
// Header should return a header for the file, including comment markers.
// Useful for copyright notices and doc strings. Include an
// autogeneration notice! Do not include the "package x" line.
Header(filename string) []byte
// Generators returns the list of generators for this package. It is
// allowed for more than one generator to write to the same file.
// A Context is passed in case the list of generators depends on the
// input types.
Generators(*Context) []Generator
}
type File struct {
Name string
FileType string
PackageName string
Header []byte
PackagePath string
PackageDir string
Imports map[string]struct{}
Vars bytes.Buffer
Consts bytes.Buffer
Body bytes.Buffer
}
type FileType interface {
AssembleFile(f *File, path string) error
}
// Generator is the contract for anything that wants to do auto-generation.
// It's expected that the io.Writers passed to the below functions will be
// ErrorTrackers; this allows implementations to not check for io errors,
// making more readable code.
//
// The call order for the functions that take a Context is:
// 1. Filter() // Subsequent calls see only types that pass this.
// 2. Namers() // Subsequent calls see the namers provided by this.
// 3. PackageVars()
// 4. PackageConsts()
// 5. Init()
// 6. GenerateType() // Called N times, once per type in the context's Order.
// 7. Imports()
//
// You may have multiple generators for the same file.
type Generator interface {
// The name of this generator. Will be included in generated comments.
Name() string
// Filter should return true if this generator cares about this type.
// (otherwise, GenerateType will not be called.)
//
// Filter is called before any of the generator's other functions;
// subsequent calls will get a context with only the types that passed
// this filter.
Filter(*Context, *types.Type) bool
// If this generator needs special namers, return them here. These will
// override the original namers in the context if there is a collision.
// You may return nil if you don't need special names. These names will
// be available in the context passed to the rest of the generator's
// functions.
//
// A use case for this is to return a namer that tracks imports.
Namers(*Context) namer.NameSystems
// Init should write an init function, and any other content that's not
// generated per-type. (It's not intended for generator specific
// initialization! Do that when your Target constructs the
// Generators.)
Init(*Context, io.Writer) error
// Finalize should write finish up functions, and any other content that's not
// generated per-type.
Finalize(*Context, io.Writer) error
// PackageVars should emit an array of variable lines. They will be
// placed in a var ( ... ) block. There's no need to include a leading
// \t or trailing \n.
PackageVars(*Context) []string
// PackageConsts should emit an array of constant lines. They will be
// placed in a const ( ... ) block. There's no need to include a leading
// \t or trailing \n.
PackageConsts(*Context) []string
// GenerateType should emit the code for a particular type.
GenerateType(*Context, *types.Type, io.Writer) error
// Imports should return a list of necessary imports. They will be
// formatted correctly. You do not need to include quotation marks,
// return only the package name; alternatively, you can also return
// imports in the format `name "path/to/pkg"`. Imports will be called
// after Init, PackageVars, PackageConsts, and GenerateType, to allow
// you to keep track of what imports you actually need.
Imports(*Context) []string
// Preferred file name of this generator, not including a path. It is
// allowed for multiple generators to use the same filename, but it's
// up to you to make sure they don't have colliding import names.
// TODO: provide per-file import tracking, removing the requirement
// that generators coordinate..
Filename() string
// A registered file type in the context to generate this file with. If
// the FileType is not found in the context, execution will stop.
FileType() string
}
// Context is global context for individual generators to consume.
type Context struct {
// A map from the naming system to the names for that system. E.g., you
// might have public names and several private naming systems.
Namers namer.NameSystems
// All the types, in case you want to look up something.
Universe types.Universe
// All the user-specified packages. This is after recursive expansion.
Inputs []string
// The canonical ordering of the types (will be filtered by both the
// Target's and Generator's Filter methods).
Order []*types.Type
// A set of types this context can process. If this is empty or nil,
// the default "go" filetype will be provided.
FileTypes map[string]FileType
// Allows generators to add packages at runtime.
parser *parser.Parser
}
// NewContext generates a context from the given parser, naming systems, and
// the naming system you wish to construct the canonical ordering from.
func NewContext(p *parser.Parser, nameSystems namer.NameSystems, canonicalOrderName string) (*Context, error) {
universe, err := p.NewUniverse()
if err != nil {
return nil, err
}
c := &Context{
Namers: namer.NameSystems{},
Universe: universe,
Inputs: p.UserRequestedPackages(),
FileTypes: map[string]FileType{
GoFileType: NewGoFile(),
},
parser: p,
}
for name, systemNamer := range nameSystems {
c.Namers[name] = systemNamer
if name == canonicalOrderName {
orderer := namer.Orderer{Namer: systemNamer}
c.Order = orderer.OrderUniverse(universe)
}
}
return c, nil
}
// LoadPackages adds Go packages to the context.
func (c *Context) LoadPackages(patterns ...string) ([]*types.Package, error) {
return c.parser.LoadPackagesTo(&c.Universe, patterns...)
}
// FindPackages expands Go package patterns into a list of package import
// paths, akin to `go list -find`.
func (c *Context) FindPackages(patterns ...string) ([]string, error) {
return c.parser.FindPackages(patterns...)
}

61
vendor/k8s.io/gengo/v2/generator/go_generator.go generated vendored Normal file
View File

@@ -0,0 +1,61 @@
/*
Copyright 2015 The Kubernetes 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.
*/
package generator
import (
"io"
"k8s.io/gengo/v2/namer"
"k8s.io/gengo/v2/types"
)
const (
GoFileType = "go"
)
// GoGenerator implements a do-nothing Generator for Go files. It can be
// used as a base for custom Generators, which embed it and then define the
// methods they need to specialize.
type GoGenerator struct {
// OutputFilename is used as the Generator's name, and filename.
OutputFilename string
// Body, if present, will be used as the return from the "Init" method.
// This causes it to be static content for the entire file if no other
// generator touches the file.
OptionalBody []byte
}
func (gg GoGenerator) Name() string { return gg.OutputFilename }
func (gg GoGenerator) Filter(*Context, *types.Type) bool { return true }
func (gg GoGenerator) Namers(*Context) namer.NameSystems { return nil }
func (gg GoGenerator) Imports(*Context) []string { return []string{} }
func (gg GoGenerator) PackageVars(*Context) []string { return []string{} }
func (gg GoGenerator) PackageConsts(*Context) []string { return []string{} }
func (gg GoGenerator) GenerateType(*Context, *types.Type, io.Writer) error { return nil }
func (gg GoGenerator) Filename() string { return gg.OutputFilename }
func (gg GoGenerator) FileType() string { return GoFileType }
func (gg GoGenerator) Finalize(*Context, io.Writer) error { return nil }
func (gg GoGenerator) Init(c *Context, w io.Writer) error {
_, err := w.Write(gg.OptionalBody)
return err
}
var (
_ = Generator(GoGenerator{})
)

96
vendor/k8s.io/gengo/v2/generator/import_tracker.go generated vendored Normal file
View File

@@ -0,0 +1,96 @@
/*
Copyright 2015 The Kubernetes 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.
*/
package generator
import (
"go/token"
"path/filepath"
"strings"
"k8s.io/klog/v2"
"k8s.io/gengo/v2/namer"
"k8s.io/gengo/v2/types"
)
// NewImportTrackerForPackage creates a new import tracker which is aware
// of a generator's output package. The tracker will not add import lines
// when symbols or types are added from the same package, and LocalNameOf
// will return empty string for the output package.
//
// e.g.:
//
// tracker := NewImportTrackerForPackage("bar.com/pkg/foo")
// tracker.AddSymbol(types.Name{"bar.com/pkg/foo.MyType"})
// tracker.AddSymbol(types.Name{"bar.com/pkg/baz.MyType"})
// tracker.AddSymbol(types.Name{"bar.com/pkg/baz/baz.MyType"})
//
// tracker.LocalNameOf("bar.com/pkg/foo") -> ""
// tracker.LocalNameOf("bar.com/pkg/baz") -> "baz"
// tracker.LocalNameOf("bar.com/pkg/baz/baz") -> "bazbaz"
// tracker.ImportLines() -> {`baz "bar.com/pkg/baz"`, `bazbaz "bar.com/pkg/baz/baz"`}
func NewImportTrackerForPackage(local string, typesToAdd ...*types.Type) *namer.DefaultImportTracker {
tracker := namer.NewDefaultImportTracker(types.Name{Package: local})
tracker.IsInvalidType = func(*types.Type) bool { return false }
tracker.LocalName = func(name types.Name) string { return goTrackerLocalName(&tracker, local, name) }
tracker.PrintImport = func(path, name string) string { return name + " \"" + path + "\"" }
tracker.AddTypes(typesToAdd...)
return &tracker
}
func NewImportTracker(typesToAdd ...*types.Type) *namer.DefaultImportTracker {
return NewImportTrackerForPackage("", typesToAdd...)
}
func goTrackerLocalName(tracker namer.ImportTracker, localPkg string, t types.Name) string {
path := t.Package
// Using backslashes in package names causes gengo to produce Go code which
// will not compile with the gc compiler. See the comment on GoSeperator.
if strings.ContainsRune(path, '\\') {
klog.Warningf("Warning: backslash used in import path '%v', this is unsupported.\n", path)
}
localLeaf := filepath.Base(localPkg)
dirs := strings.Split(path, namer.GoSeperator)
for n := len(dirs) - 1; n >= 0; n-- {
// follow kube convention of not having anything between directory names
name := strings.Join(dirs[n:], "")
name = strings.ReplaceAll(name, "_", "")
// These characters commonly appear in import paths for go
// packages, but aren't legal go names. So we'll sanitize.
name = strings.ReplaceAll(name, ".", "")
name = strings.ReplaceAll(name, "-", "")
if _, found := tracker.PathOf(name); found || name == localLeaf {
// This name collides with some other package.
// Or, this name is tne same name as the local package,
// which we avoid because it can be confusing. For example,
// if the local package is v1, we to avoid importing
// another package using the v1 name, and instead import
// it with a more qualified name, such as metav1.
continue
}
// If the import name is a Go keyword, prefix with an underscore.
if token.Lookup(name).IsKeyword() {
name = "_" + name
}
return name
}
panic("can't find import for " + path)
}

77
vendor/k8s.io/gengo/v2/generator/simple_target.go generated vendored Normal file
View File

@@ -0,0 +1,77 @@
/*
Copyright 2015 The Kubernetes 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.
*/
package generator
import (
"k8s.io/gengo/v2/types"
)
// SimpleTarget is implements Target in terms of static configuration.
// The package name, path, and dir are required to be non-empty.
type SimpleTarget struct {
// PkgName is the name of the resulting package (as in "package xxxx").
// Required.
PkgName string
// PkgPath is the canonical Go import-path of the resulting package (as in
// "import example.com/xxxx/yyyy"). Required.
PkgPath string
// PkgDir is the location of the resulting package on disk (which may not
// exist yet). It may be absolute or relative to CWD. Required.
PkgDir string
// HeaderComment is emitted at the top of every output file. Optional.
HeaderComment []byte
// PkgDocComment is emitted after the header comment for a "doc.go" file.
// Optional.
PkgDocComment []byte
// FilterFunc will be called to implement Target.Filter. Optional.
FilterFunc func(*Context, *types.Type) bool
// GeneratorsFunc will be called to implement Target.Generators. Optional.
GeneratorsFunc func(*Context) []Generator
}
func (st SimpleTarget) Name() string { return st.PkgName }
func (st SimpleTarget) Path() string { return st.PkgPath }
func (st SimpleTarget) Dir() string { return st.PkgDir }
func (st SimpleTarget) Filter(c *Context, t *types.Type) bool {
if st.FilterFunc != nil {
return st.FilterFunc(c, t)
}
return true
}
func (st SimpleTarget) Generators(c *Context) []Generator {
if st.GeneratorsFunc != nil {
return st.GeneratorsFunc(c)
}
return nil
}
func (st SimpleTarget) Header(filename string) []byte {
if filename == "doc.go" {
return append(st.HeaderComment, st.PkgDocComment...)
}
return st.HeaderComment
}
var (
_ = Target(SimpleTarget{})
)

188
vendor/k8s.io/gengo/v2/generator/snippet_writer.go generated vendored Normal file
View File

@@ -0,0 +1,188 @@
/*
Copyright 2015 The Kubernetes 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.
*/
package generator
import (
"fmt"
"io"
"runtime"
"text/template"
)
// SnippetWriter is an attempt to make the template library usable.
// Methods are chainable, and you don't have to check Error() until you're all
// done.
type SnippetWriter struct {
w io.Writer
context *Context
// Left & right delimiters. text/template defaults to "{{" and "}}"
// which is totally unusable for go code based templates.
left, right string
funcMap template.FuncMap
err error
}
// w is the destination; left and right are the delimiters; @ and $ are both
// reasonable choices.
//
// c is used to make a function for every naming system, to which you can pass
// a type and get the corresponding name.
func NewSnippetWriter(w io.Writer, c *Context, left, right string) *SnippetWriter {
sw := &SnippetWriter{
w: w,
context: c,
left: left,
right: right,
funcMap: template.FuncMap{},
}
for name, namer := range c.Namers {
sw.funcMap[name] = namer.Name
}
return sw
}
// Do parses format and runs args through it. You can have arbitrary logic in
// the format (see the text/template documentation), but consider running many
// short templates with ordinary go logic in between--this may be more
// readable. Do is chainable. Any error causes every other call to do to be
// ignored, and the error will be returned by Error(). So you can check it just
// once, at the end of your function.
//
// 'args' can be quite literally anything; read the text/template documentation
// for details. Maps and structs work particularly nicely. Conveniently, the
// types package is designed to have structs that are easily referencable from
// the template language.
//
// Example:
//
// sw := generator.NewSnippetWriter(outBuffer, context, "$", "$")
// sw.Do(`The public type name is: $.type|public$`, map[string]interface{}{"type": t})
// return sw.Error()
//
// Where:
// - "$" starts a template directive
// - "." references the entire thing passed as args
// - "type" therefore sees a map and looks up the key "type"
// - "|" means "pass the thing on the left to the thing on the right"
// - "public" is the name of a naming system, so the SnippetWriter has given
// the template a function called "public" that takes a *types.Type and
// returns the naming system's name. E.g., if the type is "string" this might
// return "String".
// - the second "$" ends the template directive.
//
// The map is actually not necessary. The below does the same thing:
//
// sw.Do(`The public type name is: $.|public$`, t)
//
// You may or may not find it more readable to use the map with a descriptive
// key, but if you want to pass more than one arg, the map or a custom struct
// becomes a requirement. You can do arbitrary logic inside these templates,
// but you should consider doing the logic in go and stitching them together
// for the sake of your readers.
//
// TODO: Change Do() to optionally take a list of pairs of parameters (key, value)
// and have it construct a combined map with that and args.
func (s *SnippetWriter) Do(format string, args interface{}) *SnippetWriter {
if s.err != nil {
return s
}
// Name the template by source file:line so it can be found when
// there's an error.
_, file, line, _ := runtime.Caller(1)
tmpl, err := template.
New(fmt.Sprintf("%s:%d", file, line)).
Delims(s.left, s.right).
Funcs(s.funcMap).
Parse(format)
if err != nil {
s.err = err
return s
}
err = tmpl.Execute(s.w, args)
if err != nil {
s.err = err
}
return s
}
// Args exists to make it convenient to construct arguments for
// SnippetWriter.Do.
type Args map[interface{}]interface{}
// With makes a copy of a and adds the given key, value pair. If key overlaps,
// the new value wins.
func (a Args) With(key, value interface{}) Args {
result := Args{}
for k, v := range a {
result[k] = v
}
result[key] = value
return result
}
// WithArgs makes a copy of a and adds the given arguments. If any keys
// overlap, the values from rhs win.
func (a Args) WithArgs(rhs Args) Args {
result := Args{}
for k, v := range a {
result[k] = v
}
for k, v := range rhs {
result[k] = v
}
return result
}
func (s *SnippetWriter) Out() io.Writer {
return s.w
}
// Error returns any encountered error.
func (s *SnippetWriter) Error() error {
return s.err
}
// Dup creates an exact duplicate SnippetWriter with a different io.Writer.
func (s *SnippetWriter) Dup(w io.Writer) *SnippetWriter {
ret := *s
ret.w = w
return &ret
}
// Append adds the contents of the io.Reader to this SnippetWriter's buffer.
func (s *SnippetWriter) Append(r io.Reader) error {
// The behavior of Do() is to ignore all future calls if there's an error,
// assuming the top-level caller will check Error(). This method is
// effectively a fancy Do(), so keep the same semantic.
if s.err != nil {
return nil
}
_, err := io.Copy(s.w, r)
return err
}
// Merge adds the contents of the io.Reader to this SnippetWriter's buffer and
// sets this SnippetWriter's error to the other's, if needed.
func (s *SnippetWriter) Merge(r io.Reader, other *SnippetWriter) error {
if s.err != nil {
return nil
}
if other.err != nil {
s.err = other.err
}
return s.Append(r)
}

31
vendor/k8s.io/gengo/v2/namer/doc.go generated vendored Normal file
View File

@@ -0,0 +1,31 @@
/*
Copyright 2015 The Kubernetes 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.
*/
// Package namer has support for making different type naming systems.
//
// This is because sometimes you want to refer to the literal type, sometimes
// you want to make a name for the thing you're generating, and you want to
// make the name based on the type. For example, if you have `type foo string`,
// you want to be able to generate something like `func FooPrinter(f *foo) {
// Print(string(*f)) }`; that is, you want to refer to a public name, a literal
// name, and the underlying literal name.
//
// This package supports the idea of a "Namer" and a set of "NameSystems" to
// support these use cases.
//
// Additionally, a "RawNamer" can optionally keep track of what needs to be
// imported.
package namer // import "k8s.io/gengo/v2/namer"

121
vendor/k8s.io/gengo/v2/namer/import_tracker.go generated vendored Normal file
View File

@@ -0,0 +1,121 @@
/*
Copyright 2015 The Kubernetes 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.
*/
package namer
import (
"sort"
"k8s.io/gengo/v2/types"
)
// ImportTracker may be passed to a namer.RawNamer, to track the imports needed
// for the types it names.
//
// TODO: pay attention to the package name (instead of renaming every package).
type DefaultImportTracker struct {
pathToName map[string]string
// forbidden names are in here. (e.g. "go" is a directory in which
// there is code, but "go" is not a legal name for a package, so we put
// it here to prevent us from naming any package "go")
nameToPath map[string]string
local types.Name
// Returns true if a given types is an invalid type and should be ignored.
IsInvalidType func(*types.Type) bool
// Returns the final local name for the given name
LocalName func(types.Name) string
// Returns the "import" line for a given (path, name).
PrintImport func(string, string) string
}
func NewDefaultImportTracker(local types.Name) DefaultImportTracker {
return DefaultImportTracker{
pathToName: map[string]string{},
nameToPath: map[string]string{},
local: local,
}
}
func (tracker *DefaultImportTracker) AddTypes(types ...*types.Type) {
for _, t := range types {
tracker.AddType(t)
}
}
func (tracker *DefaultImportTracker) AddSymbol(symbol types.Name) {
if tracker.local.Package == symbol.Package {
return
}
if len(symbol.Package) == 0 {
return
}
path := symbol.Path
if len(path) == 0 {
path = symbol.Package
}
if _, ok := tracker.pathToName[path]; ok {
return
}
name := tracker.LocalName(symbol)
tracker.nameToPath[name] = path
tracker.pathToName[path] = name
}
func (tracker *DefaultImportTracker) AddType(t *types.Type) {
if tracker.local.Package == t.Name.Package {
return
}
if tracker.IsInvalidType(t) {
if t.Kind == types.Builtin {
return
}
if _, ok := tracker.nameToPath[t.Name.Package]; !ok {
tracker.nameToPath[t.Name.Package] = ""
}
return
}
tracker.AddSymbol(t.Name)
}
func (tracker *DefaultImportTracker) ImportLines() []string {
importPaths := []string{}
for path := range tracker.pathToName {
importPaths = append(importPaths, path)
}
sort.Strings(importPaths)
out := []string{}
for _, path := range importPaths {
out = append(out, tracker.PrintImport(path, tracker.pathToName[path]))
}
return out
}
// LocalNameOf returns the name you would use to refer to the package at the
// specified path within the body of a file.
func (tracker *DefaultImportTracker) LocalNameOf(path string) string {
return tracker.pathToName[path]
}
// PathOf returns the path that a given localName is referring to within the
// body of a file.
func (tracker *DefaultImportTracker) PathOf(localName string) (string, bool) {
name, ok := tracker.nameToPath[localName]
return name, ok
}

399
vendor/k8s.io/gengo/v2/namer/namer.go generated vendored Normal file
View File

@@ -0,0 +1,399 @@
/*
Copyright 2015 The Kubernetes 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.
*/
package namer
import (
"fmt"
"path/filepath"
"strconv"
"strings"
"k8s.io/gengo/v2/types"
)
const (
// GoSeperator is used to split go import paths.
// Forward slash is used instead of filepath.Seperator because it is the
// only universally-accepted path delimiter and the only delimiter not
// potentially forbidden by Go compilers. (In particular gc does not allow
// the use of backslashes in import paths.)
// See https://golang.org/ref/spec#Import_declarations.
// See also https://github.com/kubernetes/gengo/issues/83#issuecomment-367040772.
GoSeperator = "/"
)
// Returns whether a name is a private Go name.
func IsPrivateGoName(name string) bool {
return len(name) == 0 || strings.ToLower(name[:1]) == name[:1]
}
// NewPublicNamer is a helper function that returns a namer that makes
// CamelCase names. See the NameStrategy struct for an explanation of the
// arguments to this constructor.
func NewPublicNamer(prependPackageNames int, ignoreWords ...string) *NameStrategy {
n := &NameStrategy{
Join: Joiner(IC, IC),
IgnoreWords: map[string]bool{},
PrependPackageNames: prependPackageNames,
}
for _, w := range ignoreWords {
n.IgnoreWords[w] = true
}
return n
}
// NewPrivateNamer is a helper function that returns a namer that makes
// camelCase names. See the NameStrategy struct for an explanation of the
// arguments to this constructor.
func NewPrivateNamer(prependPackageNames int, ignoreWords ...string) *NameStrategy {
n := &NameStrategy{
Join: Joiner(IL, IC),
IgnoreWords: map[string]bool{},
PrependPackageNames: prependPackageNames,
}
for _, w := range ignoreWords {
n.IgnoreWords[w] = true
}
return n
}
// NewRawNamer will return a Namer that makes a name by which you would
// directly refer to a type, optionally keeping track of the import paths
// necessary to reference the names it provides. Tracker may be nil.
// The 'pkg' is the full package name, in which the Namer is used - all
// types from that package will be referenced by just type name without
// referencing the package.
//
// For example, if the type is map[string]int, a raw namer will literally
// return "map[string]int".
//
// Or if the type, in package foo, is "type Bar struct { ... }", then the raw
// namer will return "foo.Bar" as the name of the type, and if 'tracker' was
// not nil, will record that package foo needs to be imported.
func NewRawNamer(pkg string, tracker ImportTracker) *rawNamer {
return &rawNamer{pkg: pkg, tracker: tracker}
}
// Names is a map from Type to name, as defined by some Namer.
type Names map[*types.Type]string
// Namer takes a type, and assigns a name.
//
// The purpose of this complexity is so that you can assign coherent
// side-by-side systems of names for the types. For example, you might want a
// public interface, a private implementation struct, and also to reference
// literally the type name.
//
// Note that it is safe to call your own Name() function recursively to find
// the names of keys, elements, etc. This is because anonymous types can't have
// cycles in their names, and named types don't require the sort of recursion
// that would be problematic.
type Namer interface {
Name(*types.Type) string
}
// NameSystems is a map of a system name to a namer for that system.
type NameSystems map[string]Namer
// NameStrategy is a general Namer. The easiest way to use it is to copy the
// Public/PrivateNamer variables, and modify the members you wish to change.
//
// The Name method produces a name for the given type, of the forms:
// Anonymous types: <Prefix><Type description><Suffix>
// Named types: <Prefix><Optional Prepended Package name(s)><Original name><Suffix>
//
// In all cases, every part of the name is run through the capitalization
// functions.
//
// The IgnoreWords map can be set if you have directory names that are
// semantically meaningless for naming purposes, e.g. "proto".
//
// Prefix and Suffix can be used to disambiguate parallel systems of type
// names. For example, if you want to generate an interface and an
// implementation, you might want to suffix one with "Interface" and the other
// with "Implementation". Another common use-- if you want to generate private
// types, and one of your source types could be "string", you can't use the
// default lowercase private namer. You'll have to add a suffix or prefix.
type NameStrategy struct {
Prefix, Suffix string
Join func(pre string, parts []string, post string) string
// Add non-meaningful package directory names here (e.g. "proto") and
// they will be ignored.
IgnoreWords map[string]bool
// If > 0, prepend exactly that many package directory names (or as
// many as there are). Package names listed in "IgnoreWords" will be
// ignored.
//
// For example, if Ignore words lists "proto" and type Foo is in
// pkg/server/frobbing/proto, then a value of 1 will give a type name
// of FrobbingFoo, 2 gives ServerFrobbingFoo, etc.
PrependPackageNames int
// A cache of names thus far assigned by this namer.
Names
}
// IC ensures the first character is uppercase.
func IC(in string) string {
if in == "" {
return in
}
return strings.ToUpper(in[:1]) + in[1:]
}
// IL ensures the first character is lowercase.
func IL(in string) string {
if in == "" {
return in
}
return strings.ToLower(in[:1]) + in[1:]
}
// Joiner lets you specify functions that preprocess the various components of
// a name before joining them. You can construct e.g. camelCase or CamelCase or
// any other way of joining words. (See the IC and IL convenience functions.)
func Joiner(first, others func(string) string) func(pre string, in []string, post string) string {
return func(pre string, in []string, post string) string {
tmp := []string{others(pre)}
for i := range in {
tmp = append(tmp, others(in[i]))
}
tmp = append(tmp, others(post))
return first(strings.Join(tmp, ""))
}
}
func (ns *NameStrategy) removePrefixAndSuffix(s string) string {
// The join function may have changed capitalization.
lowerIn := strings.ToLower(s)
lowerP := strings.ToLower(ns.Prefix)
lowerS := strings.ToLower(ns.Suffix)
b, e := 0, len(s)
if strings.HasPrefix(lowerIn, lowerP) {
b = len(ns.Prefix)
}
if strings.HasSuffix(lowerIn, lowerS) {
e -= len(ns.Suffix)
}
return s[b:e]
}
var (
importPathNameSanitizer = strings.NewReplacer("-", "_", ".", "")
)
// filters out unwanted directory names and sanitizes remaining names.
func (ns *NameStrategy) filterDirs(path string) []string {
allDirs := strings.Split(path, GoSeperator)
dirs := make([]string, 0, len(allDirs))
for _, p := range allDirs {
if ns.IgnoreWords == nil || !ns.IgnoreWords[p] {
dirs = append(dirs, importPathNameSanitizer.Replace(p))
}
}
return dirs
}
// See the comment on NameStrategy.
func (ns *NameStrategy) Name(t *types.Type) string {
if ns.Names == nil {
ns.Names = Names{}
}
if s, ok := ns.Names[t]; ok {
return s
}
if t.Name.Package != "" {
dirs := append(ns.filterDirs(t.Name.Package), t.Name.Name)
i := ns.PrependPackageNames + 1
dn := len(dirs)
if i > dn {
i = dn
}
name := ns.Join(ns.Prefix, dirs[dn-i:], ns.Suffix)
ns.Names[t] = name
return name
}
// Only anonymous types remain.
var name string
switch t.Kind {
case types.Builtin:
name = ns.Join(ns.Prefix, []string{t.Name.Name}, ns.Suffix)
case types.Map:
name = ns.Join(ns.Prefix, []string{
"Map",
ns.removePrefixAndSuffix(ns.Name(t.Key)),
"To",
ns.removePrefixAndSuffix(ns.Name(t.Elem)),
}, ns.Suffix)
case types.Slice:
name = ns.Join(ns.Prefix, []string{
"Slice",
ns.removePrefixAndSuffix(ns.Name(t.Elem)),
}, ns.Suffix)
case types.Array:
name = ns.Join(ns.Prefix, []string{
"Array",
ns.removePrefixAndSuffix(fmt.Sprintf("%d", t.Len)),
ns.removePrefixAndSuffix(ns.Name(t.Elem)),
}, ns.Suffix)
case types.Pointer:
name = ns.Join(ns.Prefix, []string{
"Pointer",
ns.removePrefixAndSuffix(ns.Name(t.Elem)),
}, ns.Suffix)
case types.Struct:
names := []string{"Struct"}
for _, m := range t.Members {
names = append(names, ns.removePrefixAndSuffix(ns.Name(m.Type)))
}
name = ns.Join(ns.Prefix, names, ns.Suffix)
case types.Chan:
name = ns.Join(ns.Prefix, []string{
"Chan",
ns.removePrefixAndSuffix(ns.Name(t.Elem)),
}, ns.Suffix)
case types.Interface:
// TODO: add to name test
names := []string{"Interface"}
for _, m := range t.Methods {
// TODO: include function signature
names = append(names, m.Name.Name)
}
name = ns.Join(ns.Prefix, names, ns.Suffix)
case types.Func:
// TODO: add to name test
parts := []string{"Func"}
for _, param := range t.Signature.Parameters {
parts = append(parts, ns.removePrefixAndSuffix(ns.Name(param.Type)))
}
parts = append(parts, "Returns")
for _, result := range t.Signature.Results {
parts = append(parts, ns.removePrefixAndSuffix(ns.Name(result.Type)))
}
name = ns.Join(ns.Prefix, parts, ns.Suffix)
default:
name = "unnameable_" + string(t.Kind)
}
ns.Names[t] = name
return name
}
// ImportTracker allows a raw namer to keep track of the packages needed for
// import. You can implement yourself or use the one in the generation package.
type ImportTracker interface {
AddType(*types.Type)
AddSymbol(types.Name)
LocalNameOf(packagePath string) string
PathOf(localName string) (string, bool)
ImportLines() []string
}
type rawNamer struct {
pkg string
tracker ImportTracker
Names
}
// Name makes a name the way you'd write it to literally refer to type t,
// making ordinary assumptions about how you've imported t's package (or using
// r.tracker to specifically track the package imports).
func (r *rawNamer) Name(t *types.Type) string {
if r.Names == nil {
r.Names = Names{}
}
if name, ok := r.Names[t]; ok {
return name
}
if t.Name.Package != "" {
var name string
if r.tracker != nil {
r.tracker.AddType(t)
if t.Name.Package == r.pkg {
name = t.Name.Name
} else {
name = r.tracker.LocalNameOf(t.Name.Package) + "." + t.Name.Name
}
} else {
if t.Name.Package == r.pkg {
name = t.Name.Name
} else {
name = filepath.Base(t.Name.Package) + "." + t.Name.Name
}
}
r.Names[t] = name
return name
}
var name string
switch t.Kind {
case types.Builtin:
name = t.Name.Name
case types.Map:
name = "map[" + r.Name(t.Key) + "]" + r.Name(t.Elem)
case types.Slice:
name = "[]" + r.Name(t.Elem)
case types.Array:
l := strconv.Itoa(int(t.Len))
name = "[" + l + "]" + r.Name(t.Elem)
case types.Pointer:
name = "*" + r.Name(t.Elem)
case types.Struct:
elems := []string{}
for _, m := range t.Members {
elems = append(elems, m.Name+" "+r.Name(m.Type))
}
name = "struct{" + strings.Join(elems, "; ") + "}"
case types.Chan:
// TODO: include directionality
name = "chan " + r.Name(t.Elem)
case types.Interface:
// TODO: add to name test
elems := []string{}
for _, m := range t.Methods {
// TODO: include function signature
elems = append(elems, m.Name.Name)
}
if len(elems) == 0 {
name = "any"
} else {
name = "interface{" + strings.Join(elems, "; ") + "}"
}
case types.Func:
// TODO: add to name test
params := []string{}
for _, param := range t.Signature.Parameters {
params = append(params, r.Name(param.Type))
}
results := []string{}
for _, result := range t.Signature.Results {
results = append(results, r.Name(result.Type))
}
name = "func(" + strings.Join(params, ",") + ")"
if len(results) == 1 {
name += " " + results[0]
} else if len(results) > 1 {
name += " (" + strings.Join(results, ",") + ")"
}
default:
name = "unnameable_" + string(t.Kind)
}
r.Names[t] = name
return name
}

72
vendor/k8s.io/gengo/v2/namer/order.go generated vendored Normal file
View File

@@ -0,0 +1,72 @@
/*
Copyright 2015 The Kubernetes 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.
*/
package namer
import (
"sort"
"k8s.io/gengo/v2/types"
)
// Orderer produces an ordering of types given a Namer.
type Orderer struct {
Namer
}
// OrderUniverse assigns a name to every type in the Universe, including Types,
// Functions and Variables, and returns a list sorted by those names.
func (o *Orderer) OrderUniverse(u types.Universe) []*types.Type {
list := tList{
namer: o.Namer,
}
for _, p := range u {
for _, t := range p.Types {
list.types = append(list.types, t)
}
for _, f := range p.Functions {
list.types = append(list.types, f)
}
for _, v := range p.Variables {
list.types = append(list.types, v)
}
for _, v := range p.Constants {
list.types = append(list.types, v)
}
}
sort.Sort(list)
return list.types
}
// OrderTypes assigns a name to every type, and returns a list sorted by those
// names.
func (o *Orderer) OrderTypes(typeList []*types.Type) []*types.Type {
list := tList{
namer: o.Namer,
types: typeList,
}
sort.Sort(list)
return list.types
}
type tList struct {
namer Namer
types []*types.Type
}
func (t tList) Len() int { return len(t.types) }
func (t tList) Less(i, j int) bool { return t.namer.Name(t.types[i]) < t.namer.Name(t.types[j]) }
func (t tList) Swap(i, j int) { t.types[i], t.types[j] = t.types[j], t.types[i] }

120
vendor/k8s.io/gengo/v2/namer/plural_namer.go generated vendored Normal file
View File

@@ -0,0 +1,120 @@
/*
Copyright 2015 The Kubernetes 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.
*/
package namer
import (
"strings"
"k8s.io/gengo/v2/types"
)
var consonants = "bcdfghjklmnpqrstvwxyz"
type pluralNamer struct {
// key is the case-sensitive type name, value is the case-insensitive
// intended output.
exceptions map[string]string
finalize func(string) string
}
// NewPublicPluralNamer returns a namer that returns the plural form of the input
// type's name, starting with a uppercase letter.
func NewPublicPluralNamer(exceptions map[string]string) *pluralNamer {
return &pluralNamer{exceptions, IC}
}
// NewPrivatePluralNamer returns a namer that returns the plural form of the input
// type's name, starting with a lowercase letter.
func NewPrivatePluralNamer(exceptions map[string]string) *pluralNamer {
return &pluralNamer{exceptions, IL}
}
// NewAllLowercasePluralNamer returns a namer that returns the plural form of the input
// type's name, with all letters in lowercase.
func NewAllLowercasePluralNamer(exceptions map[string]string) *pluralNamer {
return &pluralNamer{exceptions, strings.ToLower}
}
// Name returns the plural form of the type's name. If the type's name is found
// in the exceptions map, the map value is returned.
func (r *pluralNamer) Name(t *types.Type) string {
singular := t.Name.Name
var plural string
var ok bool
if plural, ok = r.exceptions[singular]; ok {
return r.finalize(plural)
}
if len(singular) < 2 {
return r.finalize(singular)
}
switch rune(singular[len(singular)-1]) {
case 's', 'x', 'z':
plural = esPlural(singular)
case 'y':
sl := rune(singular[len(singular)-2])
if isConsonant(sl) {
plural = iesPlural(singular)
} else {
plural = sPlural(singular)
}
case 'h':
sl := rune(singular[len(singular)-2])
if sl == 'c' || sl == 's' {
plural = esPlural(singular)
} else {
plural = sPlural(singular)
}
case 'e':
sl := rune(singular[len(singular)-2])
if sl == 'f' {
plural = vesPlural(singular[:len(singular)-1])
} else {
plural = sPlural(singular)
}
case 'f':
plural = vesPlural(singular)
default:
plural = sPlural(singular)
}
return r.finalize(plural)
}
func iesPlural(singular string) string {
return singular[:len(singular)-1] + "ies"
}
func vesPlural(singular string) string {
return singular[:len(singular)-1] + "ves"
}
func esPlural(singular string) string {
return singular + "es"
}
func sPlural(singular string) string {
return singular + "s"
}
func isConsonant(char rune) bool {
for _, c := range consonants {
if char == c {
return true
}
}
return false
}

19
vendor/k8s.io/gengo/v2/parser/doc.go generated vendored Normal file
View File

@@ -0,0 +1,19 @@
/*
Copyright 2015 The Kubernetes 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.
*/
// Package parser provides code to parse go files, type-check them, extract the
// types.
package parser // import "k8s.io/gengo/v2/parser"

888
vendor/k8s.io/gengo/v2/parser/parse.go generated vendored Normal file
View File

@@ -0,0 +1,888 @@
/*
Copyright 2015 The Kubernetes 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.
*/
package parser
import (
"errors"
"fmt"
"go/ast"
"go/constant"
"go/token"
gotypes "go/types"
"path/filepath"
"sort"
"strings"
"time"
"golang.org/x/tools/go/packages"
"k8s.io/gengo/v2/types"
"k8s.io/klog/v2"
)
// Parser lets you add all the go files in all the packages that you care
// about, then constructs the type source data.
type Parser struct {
// Map of package paths to definitions. These keys should be canonical
// Go import paths (example.com/foo/bar) and not local paths (./foo/bar).
goPkgs map[string]*packages.Package
// Keep track of which packages were directly requested (as opposed to
// those which are transitively loaded).
userRequested map[string]bool
// Keep track of which packages have already been scanned for types.
fullyProcessed map[string]bool
// Build tags to set when loading packages.
buildTags []string
// Tracks accumulated parsed files, so we can do position lookups later.
fset *token.FileSet
// All comments from everywhere in every parsed file. This map is keyed by
// the file-line on which the comment block ends, which makes it easy to
// look up comments which immediately precede a given obect (e.g. a type or
// function definition), which is what we almost always want. We need this
// because Go's own ast package does a very poor job of handling comments.
endLineToCommentGroup map[fileLine]*ast.CommentGroup
}
// key type for finding comments.
type fileLine struct {
file string
line int
}
// New constructs a new Parser.
func New() *Parser {
return NewWithOptions(Options{})
}
func NewWithOptions(opts Options) *Parser {
return &Parser{
goPkgs: map[string]*packages.Package{},
userRequested: map[string]bool{},
fullyProcessed: map[string]bool{},
fset: token.NewFileSet(),
endLineToCommentGroup: map[fileLine]*ast.CommentGroup{},
buildTags: opts.BuildTags,
}
}
// Options holds optional settings for the Parser.
type Options struct {
// BuildTags is a list of optional tags to be specified when loading
// packages.
BuildTags []string
}
// FindPackages expands the provided patterns into a list of Go import-paths,
// much like `go list -find`.
func (p *Parser) FindPackages(patterns ...string) ([]string, error) {
return p.findPackages(nil, patterns...)
}
// baseCfg is an optional (may be nil) config which might be injected by tests.
func (p *Parser) findPackages(baseCfg *packages.Config, patterns ...string) ([]string, error) {
toFind := make([]string, 0, len(patterns))
results := make([]string, 0, len(patterns))
for _, pat := range patterns {
if pkg := p.goPkgs[pat]; pkg != nil {
results = append(results, pkg.PkgPath)
} else {
toFind = append(toFind, pat)
}
}
if len(toFind) == 0 {
return results, nil
}
cfg := packages.Config{
Mode: packages.NeedName | packages.NeedFiles,
BuildFlags: []string{"-tags", strings.Join(p.buildTags, ",")},
Tests: false,
}
if baseCfg != nil {
// This is to support tests, e.g. to inject a fake GOPATH or CWD.
cfg.Dir = baseCfg.Dir
cfg.Env = baseCfg.Env
}
pkgs, err := packages.Load(&cfg, toFind...)
if err != nil {
return nil, fmt.Errorf("error loading packages: %w", err)
}
var allErrs []error
for _, pkg := range pkgs {
results = append(results, pkg.PkgPath)
// pkg.Errors is not a slice of `error`, but concrete types. We have
// to iteratively convert each one into `error`.
var errs []error
for _, e := range pkg.Errors {
errs = append(errs, e)
}
if len(errs) > 0 {
allErrs = append(allErrs, fmt.Errorf("error(s) in %q:\n%w", pkg.PkgPath, errors.Join(errs...)))
}
}
if len(allErrs) != 0 {
return nil, errors.Join(allErrs...)
}
return results, nil
}
// LoadPackages loads and parses the specified Go packages. Specifically
// named packages (without a trailing "/...") which do not exist or have no Go
// files are an error.
func (p *Parser) LoadPackages(patterns ...string) error {
_, err := p.loadPackages(patterns...)
return err
}
// LoadPackagesWithConfigForTesting loads and parses the specified Go packages with the
// specified packages.Config as a starting point. This is for testing, and
// only the .Dir and .Env fields of the Config will be considered.
func (p *Parser) LoadPackagesWithConfigForTesting(cfg *packages.Config, patterns ...string) error {
_, err := p.loadPackagesWithConfig(cfg, patterns...)
return err
}
// LoadPackagesTo loads and parses the specified Go packages, and inserts them
// into the specified Universe. It returns the packages which match the
// patterns, but loads all packages and their imports, recursively, into the
// universe. See NewUniverse for more.
func (p *Parser) LoadPackagesTo(u *types.Universe, patterns ...string) ([]*types.Package, error) {
// Load Packages.
pkgs, err := p.loadPackages(patterns...)
if err != nil {
return nil, err
}
// Load types in all packages (it will internally filter).
if err := p.addPkgsToUniverse(pkgs, u); err != nil {
return nil, err
}
// Return the results as gengo types.Packages.
ret := make([]*types.Package, 0, len(pkgs))
for _, pkg := range pkgs {
ret = append(ret, u.Package(pkg.PkgPath))
}
return ret, nil
}
func (p *Parser) loadPackages(patterns ...string) ([]*packages.Package, error) {
return p.loadPackagesWithConfig(nil, patterns...)
}
// baseCfg is an optional (may be nil) config which might be injected by tests.
func (p *Parser) loadPackagesWithConfig(baseCfg *packages.Config, patterns ...string) ([]*packages.Package, error) {
klog.V(5).Infof("loadPackages %q", patterns)
// Loading packages is slow - only do ones we know we have not already done
// (e.g. if a tool calls LoadPackages itself).
existingPkgs, netNewPkgs, err := p.alreadyLoaded(baseCfg, patterns...)
if err != nil {
return nil, err
}
if vlog := klog.V(5); vlog.Enabled() {
if len(existingPkgs) > 0 {
keys := make([]string, 0, len(existingPkgs))
for _, p := range existingPkgs {
keys = append(keys, p.PkgPath)
}
vlog.Infof(" already have: %q", keys)
}
if len(netNewPkgs) > 0 {
vlog.Infof(" to be loaded: %q", netNewPkgs)
}
}
// If these were not user-requested before, they are now.
for _, pkg := range existingPkgs {
if !p.userRequested[pkg.PkgPath] {
p.userRequested[pkg.PkgPath] = true
}
}
for _, pkg := range netNewPkgs {
if !p.userRequested[pkg] {
p.userRequested[pkg] = true
}
}
if len(netNewPkgs) == 0 {
return existingPkgs, nil
}
cfg := packages.Config{
Mode: packages.NeedName |
packages.NeedFiles | packages.NeedImports | packages.NeedDeps |
packages.NeedModule | packages.NeedTypes | packages.NeedSyntax,
BuildFlags: []string{"-tags", strings.Join(p.buildTags, ",")},
Fset: p.fset,
Tests: false,
}
if baseCfg != nil {
// This is to support tests, e.g. to inject a fake GOPATH or CWD.
cfg.Dir = baseCfg.Dir
cfg.Env = baseCfg.Env
}
tBefore := time.Now()
pkgs, err := packages.Load(&cfg, netNewPkgs...)
if err != nil {
return nil, fmt.Errorf("error loading packages: %w", err)
}
klog.V(5).Infof(" loaded %d pkg(s) in %v", len(pkgs), time.Since(tBefore))
// Handle any errors.
collectErrors := func(pkg *packages.Package) error {
var errs []error
for _, e := range pkg.Errors {
if e.Kind == packages.ListError || e.Kind == packages.ParseError {
errs = append(errs, e)
}
}
if len(errs) > 0 {
return fmt.Errorf("error(s) in %q:\n%w", pkg.PkgPath, errors.Join(errs...))
}
return nil
}
if err := forEachPackageRecursive(pkgs, collectErrors); err != nil {
return nil, err
}
// Finish integrating packages into our state.
absorbPkg := func(pkg *packages.Package) error {
p.goPkgs[pkg.PkgPath] = pkg
for _, f := range pkg.Syntax {
for _, c := range f.Comments {
// We need to do this on _every_ pkg, not just user-requested
// ones, because some generators look at tags in other
// packages.
//
// TODO: It would be nice if we only did this on user-requested
// packages. The problem is that we don't always know which
// other packages will need this information, and even when we
// do we may have already loaded the package (as a transitive
// dep) and might have stored pointers into it. Doing a
// thorough "reload" without invalidating all those pointers is
// a problem for another day.
position := p.fset.Position(c.End()) // Fset is synchronized
p.endLineToCommentGroup[fileLine{position.Filename, position.Line}] = c
}
}
return nil
}
if err := forEachPackageRecursive(pkgs, absorbPkg); err != nil {
return nil, err
}
return append(existingPkgs, pkgs...), nil
}
// alreadyLoaded figures out which of the specified patterns have already been loaded
// and which have not, and returns those respectively.
// baseCfg is an optional (may be nil) config which might be injected by tests.
func (p *Parser) alreadyLoaded(baseCfg *packages.Config, patterns ...string) ([]*packages.Package, []string, error) {
existingPkgs := make([]*packages.Package, 0, len(patterns))
netNewPkgs := make([]string, 0, len(patterns))
// Expand and canonicalize the requested patterns. This should be fast.
if pkgPaths, err := p.findPackages(baseCfg, patterns...); err != nil {
return nil, nil, err
} else {
for _, pkgPath := range pkgPaths {
if pkg := p.goPkgs[pkgPath]; pkg != nil {
existingPkgs = append(existingPkgs, pkg)
} else {
netNewPkgs = append(netNewPkgs, pkgPath)
}
}
}
return existingPkgs, netNewPkgs, nil
}
// forEachPackageRecursive will run the provided function on all of the specified
// packages, and on their imports recursively. Errors are accumulated and
// returned as via errors.Join.
func forEachPackageRecursive(pkgs []*packages.Package, fn func(pkg *packages.Package) error) error {
seen := map[string]bool{} // PkgPaths we have already visited
var errs []error
for _, pkg := range pkgs {
errs = append(errs, recursePackage(pkg, fn, seen)...)
}
if len(errs) > 0 {
return errors.Join(errs...)
}
return nil
}
func recursePackage(pkg *packages.Package, fn func(pkg *packages.Package) error, seen map[string]bool) []error {
if seen[pkg.PkgPath] {
return nil
}
var errs []error
seen[pkg.PkgPath] = true
if err := fn(pkg); err != nil {
errs = append(errs, err)
}
for _, imp := range pkg.Imports {
errs = append(errs, recursePackage(imp, fn, seen)...)
}
return errs
}
// UserRequestedPackages fetches a list of the user-imported packages.
func (p *Parser) UserRequestedPackages() []string {
// Iterate packages in a predictable order.
pkgPaths := make([]string, 0, len(p.userRequested))
for k := range p.userRequested {
pkgPaths = append(pkgPaths, string(k))
}
sort.Strings(pkgPaths)
return pkgPaths
}
// NewUniverse finalizes the loaded packages, searches through them for types
// and produces a new Universe. The returned Universe has one types.Package
// entry for each Go package that has been loaded, including all of their
// dependencies, recursively. It also has one entry, whose key is "", which
// represents "builtin" types.
func (p *Parser) NewUniverse() (types.Universe, error) {
u := types.Universe{}
pkgs := []*packages.Package{}
for _, path := range p.UserRequestedPackages() {
pkgs = append(pkgs, p.goPkgs[path])
}
if err := p.addPkgsToUniverse(pkgs, &u); err != nil {
return nil, err
}
return u, nil
}
// addCommentsToType takes any accumulated comment lines prior to obj and
// attaches them to the type t.
func (p *Parser) addCommentsToType(obj gotypes.Object, t *types.Type) {
t.CommentLines = p.docComment(obj.Pos())
t.SecondClosestCommentLines = p.priorDetachedComment(obj.Pos())
}
// packageDir tries to figure out the directory of the specified package.
func packageDir(pkg *packages.Package) (string, error) {
// Sometimes Module is present but has no Dir, e.g. when it is vendored.
if pkg.Module != nil && pkg.Module.Dir != "" {
// NOTE: this will not work if tests are loaded, because Go mutates the
// Package.PkgPath.
subdir := strings.TrimPrefix(pkg.PkgPath, pkg.Module.Path)
return filepath.Join(pkg.Module.Dir, subdir), nil
}
if len(pkg.GoFiles) > 0 {
return filepath.Dir(pkg.GoFiles[0]), nil
}
if len(pkg.IgnoredFiles) > 0 {
return filepath.Dir(pkg.IgnoredFiles[0]), nil
}
return "", fmt.Errorf("can't find package dir for %q - no module info and no Go files", pkg.PkgPath)
}
// addPkgsToUniverse adds the packages, and all of their deps, recursively, to
// the universe and (if needed) searches through them for types.
func (p *Parser) addPkgsToUniverse(pkgs []*packages.Package, u *types.Universe) error {
addOne := func(pkg *packages.Package) error {
if err := p.addPkgToUniverse(pkg, u); err != nil {
return err
}
return nil
}
if err := forEachPackageRecursive(pkgs, addOne); err != nil {
return err
}
return nil
}
// addPkgToUniverse adds one package to the universe and (if needed) searches
// through it for types.
func (p *Parser) addPkgToUniverse(pkg *packages.Package, u *types.Universe) error {
pkgPath := pkg.PkgPath
if p.fullyProcessed[pkgPath] {
return nil
}
// This will get-or-create the Package.
gengoPkg := u.Package(pkgPath)
if gengoPkg.Dir == "" {
// We're keeping this package, though we might not fully process it.
if vlog := klog.V(5); vlog.Enabled() {
why := "user-requested"
if !p.userRequested[pkgPath] {
why = "dependency"
}
vlog.Infof("addPkgToUniverse %q (%s)", pkgPath, why)
}
absPath := ""
if dir, err := packageDir(pkg); err != nil {
return err
} else {
absPath = dir
}
gengoPkg.Path = pkg.PkgPath
gengoPkg.Dir = absPath
}
// If the package was not user-requested, we can stop here.
if !p.userRequested[pkgPath] {
return nil
}
// Mark it as done, so we don't ever re-process it.
p.fullyProcessed[pkgPath] = true
gengoPkg.Name = pkg.Name
// For historical reasons we treat files named "doc.go" specially.
// TODO: It would be nice to not do this and instead treat package
// doc-comments as the "global" config place. This would require changing
// most generators and input files.
for _, f := range pkg.Syntax {
// This gets the filename for the ast.File. Iterating pkg.GoFiles is
// documented as unreliable.
pos := p.fset.Position(f.FileStart)
if filepath.Base(pos.Filename) == "doc.go" {
gengoPkg.Comments = []string{}
for i := range f.Comments {
gengoPkg.Comments = append(gengoPkg.Comments, splitLines(f.Comments[i].Text())...)
}
if f.Doc != nil {
gengoPkg.DocComments = splitLines(f.Doc.Text())
}
}
}
// Walk all the types, recursively and save them for later access.
s := pkg.Types.Scope()
for _, n := range s.Names() {
switch obj := s.Lookup(n).(type) {
case *gotypes.TypeName:
t := p.walkType(*u, nil, obj.Type())
p.addCommentsToType(obj, t)
case *gotypes.Func:
// We only care about functions, not concrete/abstract methods.
if obj.Type() != nil && obj.Type().(*gotypes.Signature).Recv() == nil {
t := p.addFunction(*u, nil, obj)
p.addCommentsToType(obj, t)
}
case *gotypes.Var:
if !obj.IsField() {
t := p.addVariable(*u, nil, obj)
p.addCommentsToType(obj, t)
}
case *gotypes.Const:
t := p.addConstant(*u, nil, obj)
p.addCommentsToType(obj, t)
default:
klog.Infof("addPkgToUniverse %q: unhandled object of type %T: %v", pkgPath, obj, obj)
}
}
// Add all of this package's imports.
importedPkgs := []string{}
for _, imp := range pkg.Imports {
if err := p.addPkgToUniverse(imp, u); err != nil {
return err
}
importedPkgs = append(importedPkgs, imp.PkgPath)
}
sort.Strings(importedPkgs)
u.AddImports(pkg.PkgPath, importedPkgs...)
return nil
}
// If the specified position has a "doc comment", return that.
func (p *Parser) docComment(pos token.Pos) []string {
// An object's doc comment always ends on the line before the object's own
// declaration.
c1 := p.priorCommentLines(pos, 1)
return splitLines(c1.Text()) // safe even if c1 is nil
}
// If there is a detached (not immediately before a declaration) comment,
// return that.
func (p *Parser) priorDetachedComment(pos token.Pos) []string {
// An object's doc comment always ends on the line before the object's own
// declaration.
c1 := p.priorCommentLines(pos, 1)
// Using a literal "2" here is brittle in theory (it means literally 2
// lines), but in practice Go code is gofmt'ed (which elides repeated blank
// lines), so it works.
var c2 *ast.CommentGroup
if c1 == nil {
c2 = p.priorCommentLines(pos, 2)
} else {
c2 = p.priorCommentLines(c1.List[0].Slash, 2)
}
return splitLines(c2.Text()) // safe even if c1 is nil
}
// If there's a comment block which ends nlines before pos, return it.
func (p *Parser) priorCommentLines(pos token.Pos, lines int) *ast.CommentGroup {
position := p.fset.Position(pos)
key := fileLine{position.Filename, position.Line - lines}
return p.endLineToCommentGroup[key]
}
func splitLines(str string) []string {
return strings.Split(strings.TrimRight(str, "\n"), "\n")
}
func goFuncNameToName(in string) types.Name {
name := strings.TrimPrefix(in, "func ")
nameParts := strings.Split(name, "(")
return goNameToName(nameParts[0])
}
func goVarNameToName(in string) types.Name {
nameParts := strings.Split(in, " ")
// nameParts[0] is "var".
// nameParts[2:] is the type of the variable, we ignore it for now.
return goNameToName(nameParts[1])
}
// goNameToName converts a go name string to a gengo types.Name.
// It operates solely on the string on a best effort basis. The name may be updated
// in walkType for generics.
func goNameToName(in string) types.Name {
// Detect anonymous type names. (These may have '.' characters because
// embedded types may have packages, so we detect them specially.)
if strings.HasPrefix(in, "struct{") ||
strings.HasPrefix(in, "<-chan") ||
strings.HasPrefix(in, "chan<-") ||
strings.HasPrefix(in, "chan ") ||
strings.HasPrefix(in, "func(") ||
strings.HasPrefix(in, "func (") ||
strings.HasPrefix(in, "*") ||
strings.HasPrefix(in, "map[") ||
strings.HasPrefix(in, "[") {
return types.Name{Name: in}
}
// There may be '.' characters within a generic. Temporarily remove
// the generic.
genericIndex := strings.IndexRune(in, '[')
if genericIndex == -1 {
genericIndex = len(in)
}
// Otherwise, if there are '.' characters present, the name has a
// package path in front.
nameParts := strings.Split(in[:genericIndex], ".")
name := types.Name{Name: in}
if n := len(nameParts); n >= 2 {
// The final "." is the name of the type--previous ones must
// have been in the package path.
name.Package, name.Name = strings.Join(nameParts[:n-1], "."), nameParts[n-1]
// Add back the generic component now that the package and type name have been separated.
if genericIndex != len(in) {
name.Name = name.Name + in[genericIndex:]
}
}
return name
}
func (p *Parser) convertSignature(u types.Universe, t *gotypes.Signature) *types.Signature {
signature := &types.Signature{}
for i := 0; i < t.Params().Len(); i++ {
signature.Parameters = append(signature.Parameters, &types.ParamResult{
Name: t.Params().At(i).Name(),
Type: p.walkType(u, nil, t.Params().At(i).Type()),
})
}
for i := 0; i < t.Results().Len(); i++ {
signature.Results = append(signature.Results, &types.ParamResult{
Name: t.Results().At(i).Name(),
Type: p.walkType(u, nil, t.Results().At(i).Type()),
})
}
if r := t.Recv(); r != nil {
signature.Receiver = p.walkType(u, nil, r.Type())
}
signature.Variadic = t.Variadic()
return signature
}
// walkType adds the type, and any necessary child types.
func (p *Parser) walkType(u types.Universe, useName *types.Name, in gotypes.Type) *types.Type {
// Most of the cases are underlying types of the named type.
name := goNameToName(in.String())
if useName != nil {
name = *useName
}
// Handle alias types conditionally on go1.22+.
// Inline this once the minimum supported version is go1.22
if out := p.walkAliasType(u, in); out != nil {
return out
}
switch t := in.(type) {
case *gotypes.Struct:
out := u.Type(name)
out.GoType = in
if out.Kind != types.Unknown {
return out
}
out.Kind = types.Struct
for i := 0; i < t.NumFields(); i++ {
f := t.Field(i)
m := types.Member{
Name: f.Name(),
Embedded: f.Anonymous(),
Tags: t.Tag(i),
Type: p.walkType(u, nil, f.Type()),
CommentLines: p.docComment(f.Pos()),
}
out.Members = append(out.Members, m)
}
return out
case *gotypes.Map:
out := u.Type(name)
out.GoType = in
if out.Kind != types.Unknown {
return out
}
out.Kind = types.Map
out.Elem = p.walkType(u, nil, t.Elem())
out.Key = p.walkType(u, nil, t.Key())
return out
case *gotypes.Pointer:
out := u.Type(name)
out.GoType = in
if out.Kind != types.Unknown {
return out
}
out.Kind = types.Pointer
out.Elem = p.walkType(u, nil, t.Elem())
return out
case *gotypes.Slice:
out := u.Type(name)
out.GoType = in
if out.Kind != types.Unknown {
return out
}
out.Kind = types.Slice
out.Elem = p.walkType(u, nil, t.Elem())
return out
case *gotypes.Array:
out := u.Type(name)
out.GoType = in
if out.Kind != types.Unknown {
return out
}
out.Kind = types.Array
out.Elem = p.walkType(u, nil, t.Elem())
out.Len = in.(*gotypes.Array).Len()
return out
case *gotypes.Chan:
out := u.Type(name)
out.GoType = in
if out.Kind != types.Unknown {
return out
}
out.Kind = types.Chan
out.Elem = p.walkType(u, nil, t.Elem())
// TODO: need to store direction, otherwise raw type name
// cannot be properly written.
return out
case *gotypes.Basic:
out := u.Type(types.Name{
Package: "", // This is a magic package name in the Universe.
Name: t.Name(),
})
out.GoType = in
if out.Kind != types.Unknown {
return out
}
out.Kind = types.Unsupported
return out
case *gotypes.Signature:
out := u.Type(name)
out.GoType = in
if out.Kind != types.Unknown {
return out
}
out.Kind = types.Func
out.Signature = p.convertSignature(u, t)
return out
case *gotypes.Interface:
out := u.Type(name)
out.GoType = in
if out.Kind != types.Unknown {
return out
}
out.Kind = types.Interface
t.Complete()
for i := 0; i < t.NumMethods(); i++ {
if out.Methods == nil {
out.Methods = map[string]*types.Type{}
}
method := t.Method(i)
name := goNameToName(method.String())
mt := p.walkType(u, &name, method.Type())
mt.CommentLines = p.docComment(method.Pos())
out.Methods[method.Name()] = mt
}
return out
case *gotypes.Named:
var out *types.Type
switch t.Underlying().(type) {
case *gotypes.Named, *gotypes.Basic, *gotypes.Map, *gotypes.Slice:
name := goNameToName(t.String())
out = u.Type(name)
out.GoType = in
if out.Kind != types.Unknown {
return out
}
out.Kind = types.Alias
out.Underlying = p.walkType(u, nil, t.Underlying())
case *gotypes.Struct, *gotypes.Interface:
name := goNameToName(t.String())
tpMap := map[string]*types.Type{}
if t.TypeParams().Len() != 0 {
// Remove generics, then readd them without the encoded
// type, e.g. Foo[T any] => Foo[T]
var tpNames []string
for i := 0; i < t.TypeParams().Len(); i++ {
tp := t.TypeParams().At(i)
tpName := tp.Obj().Name()
tpNames = append(tpNames, tpName)
tpMap[tpName] = p.walkType(u, nil, tp.Constraint())
}
name.Name = fmt.Sprintf("%s[%s]", strings.SplitN(name.Name, "[", 2)[0], strings.Join(tpNames, ","))
}
if out := u.Type(name); out.Kind != types.Unknown {
out.GoType = in
return out // short circuit if we've already made this.
}
out = p.walkType(u, &name, t.Underlying())
out.TypeParams = tpMap
default:
// gotypes package makes everything "named" with an
// underlying anonymous type--we remove that annoying
// "feature" for users. This flattens those types
// together.
name := goNameToName(t.String())
if out := u.Type(name); out.Kind != types.Unknown {
return out // short circuit if we've already made this.
}
out = p.walkType(u, &name, t.Underlying())
}
// If the underlying type didn't already add methods, add them.
// (Interface types will have already added methods.)
if len(out.Methods) == 0 {
for i := 0; i < t.NumMethods(); i++ {
if out.Methods == nil {
out.Methods = map[string]*types.Type{}
}
method := t.Method(i)
name := goNameToName(method.String())
mt := p.walkType(u, &name, method.Type())
mt.CommentLines = p.docComment(method.Pos())
out.Methods[method.Name()] = mt
}
}
return out
case *gotypes.TypeParam:
// DO NOT retrieve the type from the universe. The default type-param name is only the
// generic variable name. Ideally, it would be namespaced by package and struct but it is
// not. Thus, if we try to use the universe, we would start polluting it.
// e.g. if Foo[T] and Bar[T] exists, we'd mistakenly use the same type T for both.
return &types.Type{
Name: name,
Kind: types.TypeParam,
}
default:
out := u.Type(name)
out.GoType = in
if out.Kind != types.Unknown {
return out
}
out.Kind = types.Unsupported
klog.Warningf("Making unsupported type entry %q for: %#v\n", out, t)
return out
}
}
func (p *Parser) addFunction(u types.Universe, useName *types.Name, in *gotypes.Func) *types.Type {
name := goFuncNameToName(in.String())
if useName != nil {
name = *useName
}
out := u.Function(name)
out.Kind = types.DeclarationOf
out.Underlying = p.walkType(u, nil, in.Type())
return out
}
func (p *Parser) addVariable(u types.Universe, useName *types.Name, in *gotypes.Var) *types.Type {
name := goVarNameToName(in.String())
if useName != nil {
name = *useName
}
out := u.Variable(name)
out.Kind = types.DeclarationOf
out.Underlying = p.walkType(u, nil, in.Type())
return out
}
func (p *Parser) addConstant(u types.Universe, useName *types.Name, in *gotypes.Const) *types.Type {
name := goVarNameToName(in.String())
if useName != nil {
name = *useName
}
out := u.Constant(name)
out.Kind = types.DeclarationOf
out.Underlying = p.walkType(u, nil, in.Type())
var constval string
// For strings, we use `StringVal()` to get the un-truncated,
// un-quoted string. For other values, `.String()` is preferable to
// get something relatively human readable (especially since for
// floating point types, `ExactString()` will generate numeric
// expressions using `big.(*Float).Text()`.
switch in.Val().Kind() {
case constant.String:
constval = constant.StringVal(in.Val())
default:
constval = in.Val().String()
}
out.ConstValue = &constval
return out
}

33
vendor/k8s.io/gengo/v2/parser/parse_122.go generated vendored Normal file
View File

@@ -0,0 +1,33 @@
//go:build go1.22
// +build go1.22
/*
Copyright 2024 The Kubernetes 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.
*/
package parser
import (
gotypes "go/types"
"k8s.io/gengo/v2/types"
)
func (p *Parser) walkAliasType(u types.Universe, in gotypes.Type) *types.Type {
if t, isAlias := in.(*gotypes.Alias); isAlias {
return p.walkType(u, nil, gotypes.Unalias(t))
}
return nil
}

30
vendor/k8s.io/gengo/v2/parser/parse_pre_122.go generated vendored Normal file
View File

@@ -0,0 +1,30 @@
//go:build !go1.22
// +build !go1.22
/*
Copyright 2024 The Kubernetes 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.
*/
package parser
import (
gotypes "go/types"
"k8s.io/gengo/v2/types"
)
func (p *Parser) walkAliasType(u types.Universe, in gotypes.Type) *types.Type {
return nil
}

19
vendor/k8s.io/gengo/v2/types/doc.go generated vendored Normal file
View File

@@ -0,0 +1,19 @@
/*
Copyright 2015 The Kubernetes 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.
*/
// Package types contains go type information, packaged in a way that makes
// auto-generation convenient, whether by template or straight go functions.
package types // import "k8s.io/gengo/v2/types"

575
vendor/k8s.io/gengo/v2/types/types.go generated vendored Normal file
View File

@@ -0,0 +1,575 @@
/*
Copyright 2015 The Kubernetes 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.
*/
package types
import (
gotypes "go/types"
"strings"
)
// Ref makes a reference to the given type. It can only be used for e.g.
// passing to namers.
func Ref(packageName, typeName string) *Type {
return &Type{Name: Name{
Name: typeName,
Package: packageName,
}}
}
// A type name may have a package qualifier.
type Name struct {
// Empty if embedded or builtin. This is the package path unless Path is specified.
Package string
// The type name.
Name string
// An optional location of the type definition for languages that can have disjoint
// packages and paths.
Path string
}
// String returns the name formatted as a string.
func (n Name) String() string {
if n.Package == "" {
return n.Name
}
return n.Package + "." + n.Name
}
// ParseFullyQualifiedName parses a name like k8s.io/kubernetes/pkg/api.Pod into a Name.
func ParseFullyQualifiedName(fqn string) Name {
cs := strings.Split(fqn, ".")
pkg := ""
if len(cs) > 1 {
pkg = strings.Join(cs[0:len(cs)-1], ".")
}
return Name{
Name: cs[len(cs)-1],
Package: pkg,
}
}
// The possible classes of types.
type Kind string
const (
// Builtin is a primitive, like bool, string, int.
Builtin Kind = "Builtin"
Struct Kind = "Struct"
Map Kind = "Map"
Slice Kind = "Slice"
Pointer Kind = "Pointer"
// Alias is an alias of another type, e.g. in:
// type Foo string
// type Bar Foo
// Bar is an alias of Foo.
//
// In the real go type system, Foo is a "Named" string; but to simplify
// generation, this type system will just say that Foo *is* a builtin.
// We then need "Alias" as a way for us to say that Bar *is* a Foo.
Alias Kind = "Alias"
// Interface is any type that could have differing types at run time.
Interface Kind = "Interface"
// Array is just like slice, but has a fixed length.
Array Kind = "Array"
// The remaining types are included for completeness, but are not well
// supported.
Chan Kind = "Chan"
Func Kind = "Func"
// DeclarationOf is different from other Kinds; it indicates that instead of
// representing an actual Type, the type is a declaration of an instance of
// a type. E.g., a top-level function, variable, or constant. See the
// comment for Type.Name for more detail.
DeclarationOf Kind = "DeclarationOf"
Unknown Kind = ""
Unsupported Kind = "Unsupported"
TypeParam Kind = "TypeParam"
// Protobuf is protobuf type.
Protobuf Kind = "Protobuf"
)
// Package holds package-level information.
// Fields are public, as everything in this package, to enable consumption by
// templates (for example). But it is strongly encouraged for code to build by
// using the provided functions.
type Package struct {
// Canonical import-path of this package.
Path string
// The location (on disk) of this package.
Dir string
// Short name of this package, as in the 'package x' line.
Name string
// The comment right above the package declaration in doc.go, if any.
DocComments []string
// All comments from doc.go, if any.
// TODO: remove Comments and use DocComments everywhere.
Comments []string
// Types within this package, indexed by their name (*not* including
// package name).
Types map[string]*Type
// Functions within this package, indexed by their name (*not* including
// package name).
Functions map[string]*Type
// Global variables within this package, indexed by their name (*not* including
// package name).
Variables map[string]*Type
// Global constants within this package, indexed by their name (*not* including
// package name).
Constants map[string]*Type
// Packages imported by this package, indexed by (canonicalized)
// package path.
Imports map[string]*Package
}
// Has returns true if the given name references a type known to this package.
func (p *Package) Has(name string) bool {
_, has := p.Types[name]
return has
}
// Type gets the given Type in this Package. If the Type is not already
// defined, this will add it and return the new Type value. The caller is
// expected to finish initialization.
func (p *Package) Type(typeName string) *Type {
if t, ok := p.Types[typeName]; ok {
return t
}
if p.Path == "" {
// Import the standard builtin types!
if t, ok := builtins.Types[typeName]; ok {
p.Types[typeName] = t
return t
}
}
t := &Type{Name: Name{Package: p.Path, Name: typeName}}
p.Types[typeName] = t
return t
}
// Function gets the given function Type in this Package. If the function is
// not already defined, this will add it. If a function is added, it's the
// caller's responsibility to finish construction of the function by setting
// Underlying to the correct type.
func (p *Package) Function(funcName string) *Type {
if t, ok := p.Functions[funcName]; ok {
return t
}
t := &Type{Name: Name{Package: p.Path, Name: funcName}}
t.Kind = DeclarationOf
p.Functions[funcName] = t
return t
}
// Variable gets the given variable Type in this Package. If the variable is
// not already defined, this will add it. If a variable is added, it's the caller's
// responsibility to finish construction of the variable by setting Underlying
// to the correct type.
func (p *Package) Variable(varName string) *Type {
if t, ok := p.Variables[varName]; ok {
return t
}
t := &Type{Name: Name{Package: p.Path, Name: varName}}
t.Kind = DeclarationOf
p.Variables[varName] = t
return t
}
// Constant gets the given constant Type in this Package. If the constant is
// not already defined, this will add it. If a constant is added, it's the caller's
// responsibility to finish construction of the constant by setting Underlying
// to the correct type.
func (p *Package) Constant(constName string) *Type {
if t, ok := p.Constants[constName]; ok {
return t
}
t := &Type{Name: Name{Package: p.Path, Name: constName}}
t.Kind = DeclarationOf
p.Constants[constName] = t
return t
}
// HasImport returns true if p imports packageName. Package names include the
// package directory.
func (p *Package) HasImport(packageName string) bool {
_, has := p.Imports[packageName]
return has
}
// Universe is a map of all packages. The key is the package name, but you
// should use Package(), Type(), Function(), or Variable() instead of direct
// access.
type Universe map[string]*Package
// Type returns the canonical type for the given fully-qualified name. Builtin
// types will always be found, even if they haven't been explicitly added to
// the map. If a non-existing type is requested, this will create (a marker for)
// it.
func (u Universe) Type(n Name) *Type {
return u.Package(n.Package).Type(n.Name)
}
// Function returns the canonical function for the given fully-qualified name.
// If a non-existing function is requested, this will create (a marker for) it.
// If a marker is created, it's the caller's responsibility to finish
// construction of the function by setting Underlying to the correct type.
func (u Universe) Function(n Name) *Type {
return u.Package(n.Package).Function(n.Name)
}
// Variable returns the canonical variable for the given fully-qualified name.
// If a non-existing variable is requested, this will create (a marker for) it.
// If a marker is created, it's the caller's responsibility to finish
// construction of the variable by setting Underlying to the correct type.
func (u Universe) Variable(n Name) *Type {
return u.Package(n.Package).Variable(n.Name)
}
// Constant returns the canonical constant for the given fully-qualified name.
// If a non-existing constant is requested, this will create (a marker for) it.
// If a marker is created, it's the caller's responsibility to finish
// construction of the constant by setting Underlying to the correct type.
func (u Universe) Constant(n Name) *Type {
return u.Package(n.Package).Constant(n.Name)
}
// AddImports registers import lines for packageName. May be called multiple times.
// You are responsible for canonicalizing all package paths.
func (u Universe) AddImports(packagePath string, importPaths ...string) {
p := u.Package(packagePath)
for _, i := range importPaths {
p.Imports[i] = u.Package(i)
}
}
// Package returns the Package for the given path.
// If a non-existing package is requested, this will create (a marker for) it.
// If a marker is created, it's the caller's responsibility to finish
// construction of the package.
func (u Universe) Package(packagePath string) *Package {
if p, ok := u[packagePath]; ok {
return p
}
p := &Package{
Path: packagePath,
Types: map[string]*Type{},
Functions: map[string]*Type{},
Variables: map[string]*Type{},
Constants: map[string]*Type{},
Imports: map[string]*Package{},
}
u[packagePath] = p
return p
}
// Type represents a subset of possible go types.
type Type struct {
// There are two general categories of types, those explicitly named
// and those anonymous. Named ones will have a non-empty package in the
// name field.
//
// An exception: If Kind == DeclarationOf, then this name is the name of a
// top-level function, variable, or const, and the type can be found in Underlying.
// We do this to allow the naming system to work against these objects, even
// though they aren't strictly speaking types.
Name Name
// The general kind of this type.
Kind Kind
// If there are comment lines immediately before the type definition,
// they will be recorded here.
CommentLines []string
// If there are comment lines preceding the `CommentLines`, they will be
// recorded here. There are two cases:
// ---
// SecondClosestCommentLines
// a blank line
// CommentLines
// type definition
// ---
//
// or
// ---
// SecondClosestCommentLines
// a blank line
// type definition
// ---
SecondClosestCommentLines []string
// If Kind == Struct
Members []Member
// If Kind == Struct
TypeParams map[string]*Type
// If Kind == Map, Slice, Pointer, or Chan
Elem *Type
// If Kind == Map, this is the map's key type.
Key *Type
// If Kind == Alias, this is the underlying type.
// If Kind == DeclarationOf, this is the type of the declaration.
Underlying *Type
// If Kind == Interface, this is the set of all required functions.
// Otherwise, if this is a named type, this is the list of methods that
// type has. (All elements will have Kind=="Func")
Methods map[string]*Type
// If Kind == func, this is the signature of the function.
Signature *Signature
// ConstValue contains a stringified constant value if
// Kind == DeclarationOf and this is a constant value
// declaration. For string constants, this field contains
// the entire, un-quoted value. For other types, it contains
// a human-readable literal.
ConstValue *string
// TODO: Add:
// * channel direction
// If Kind == Array
Len int64
// The underlying Go type.
GoType gotypes.Type
}
// String returns the name of the type.
func (t *Type) String() string {
if t == nil {
return "" // makes tests easier
}
return t.Name.String()
}
// IsPrimitive returns whether the type is a built-in type or is an alias to a
// built-in type. For example: strings and aliases of strings are primitives,
// structs are not.
func (t *Type) IsPrimitive() bool {
if t.Kind == Builtin || (t.Kind == Alias && t.Underlying.Kind == Builtin) {
return true
}
return false
}
// IsAssignable returns whether the type is deep-assignable. For example,
// slices and maps and pointers are shallow copies, but ints and strings are
// complete.
func (t *Type) IsAssignable() bool {
if t.IsPrimitive() {
return true
}
if t.Kind == Struct {
for _, m := range t.Members {
if !m.Type.IsAssignable() {
return false
}
}
return true
}
return false
}
// IsAnonymousStruct returns true if the type is an anonymous struct or an alias
// to an anonymous struct.
func (t *Type) IsAnonymousStruct() bool {
return (t.Kind == Struct && t.Name.Name == "struct{}") || (t.Kind == Alias && t.Underlying.IsAnonymousStruct())
}
// IsComparable returns whether the type is comparable.
func (t *Type) IsComparable() bool {
return gotypes.Comparable(t.GoType)
}
// A single struct member
type Member struct {
// The name of the member.
Name string
// If the member is embedded (anonymous) this will be true, and the
// Name will be the type name.
Embedded bool
// If there are comment lines immediately before the member in the type
// definition, they will be recorded here.
CommentLines []string
// If there are tags along with this member, they will be saved here.
Tags string
// The type of this member.
Type *Type
}
// String returns the name and type of the member.
func (m Member) String() string {
return m.Name + " " + m.Type.String()
}
// ParamResult represents a parameter or a result of a method's signature.
type ParamResult struct {
// The name of the parameter or result.
Name string
// The type of this parameter or result.
Type *Type
}
// Signature is a function's signature.
type Signature struct {
// If a method of some type, this is the type it's a member of.
Receiver *Type
Parameters []*ParamResult
Results []*ParamResult
// True if the last in parameter is of the form ...T.
Variadic bool
// If there are comment lines immediately before this
// signature/method/function declaration, they will be recorded here.
CommentLines []string
}
// Built in types.
var (
Any = &Type{
Name: Name{Name: "any"},
Kind: Interface,
}
String = &Type{
Name: Name{Name: "string"},
Kind: Builtin,
}
Int64 = &Type{
Name: Name{Name: "int64"},
Kind: Builtin,
}
Int32 = &Type{
Name: Name{Name: "int32"},
Kind: Builtin,
}
Int16 = &Type{
Name: Name{Name: "int16"},
Kind: Builtin,
}
Int = &Type{
Name: Name{Name: "int"},
Kind: Builtin,
}
Uint64 = &Type{
Name: Name{Name: "uint64"},
Kind: Builtin,
}
Uint32 = &Type{
Name: Name{Name: "uint32"},
Kind: Builtin,
}
Uint16 = &Type{
Name: Name{Name: "uint16"},
Kind: Builtin,
}
Uint = &Type{
Name: Name{Name: "uint"},
Kind: Builtin,
}
Uintptr = &Type{
Name: Name{Name: "uintptr"},
Kind: Builtin,
}
Float64 = &Type{
Name: Name{Name: "float64"},
Kind: Builtin,
}
Float32 = &Type{
Name: Name{Name: "float32"},
Kind: Builtin,
}
Float = &Type{
Name: Name{Name: "float"},
Kind: Builtin,
}
Bool = &Type{
Name: Name{Name: "bool"},
Kind: Builtin,
}
Byte = &Type{
Name: Name{Name: "byte"},
Kind: Builtin,
}
builtins = &Package{
Types: map[string]*Type{
"any": Any,
"bool": Bool,
"string": String,
"int": Int,
"int64": Int64,
"int32": Int32,
"int16": Int16,
"int8": Byte,
"uint": Uint,
"uint64": Uint64,
"uint32": Uint32,
"uint16": Uint16,
"uint8": Byte,
"uintptr": Uintptr,
"byte": Byte,
"float": Float,
"float64": Float64,
"float32": Float32,
},
Imports: map[string]*Package{},
Path: "",
Name: "",
}
)
func PointerTo(t *Type) *Type {
return &Type{
Name: Name{
Name: "*" + t.Name.String(),
},
Kind: Pointer,
Elem: t,
}
}
func IsInteger(t *Type) bool {
switch t {
case Int, Int64, Int32, Int16, Uint, Uint64, Uint32, Uint16, Byte:
return true
default:
return false
}
}

14
vendor/modules.txt vendored
View File

@@ -2730,6 +2730,12 @@ k8s.io/cloud-provider-vsphere/pkg/common/config
## explicit; go 1.24.0
k8s.io/cluster-bootstrap/token/api
k8s.io/cluster-bootstrap/token/util
# k8s.io/code-generator v0.34.1
## explicit; go 1.24.0
k8s.io/code-generator/cmd/deepcopy-gen
k8s.io/code-generator/cmd/deepcopy-gen/args
k8s.io/code-generator/cmd/deepcopy-gen/generators
k8s.io/code-generator/pkg/util
# k8s.io/component-base v0.34.1
## explicit; go 1.24.0
k8s.io/component-base/featuregate
@@ -2738,6 +2744,14 @@ k8s.io/component-base/metrics/legacyregistry
k8s.io/component-base/metrics/prometheus/feature
k8s.io/component-base/metrics/prometheusextension
k8s.io/component-base/version
# k8s.io/gengo/v2 v2.0.0-20250604051438-85fd79dbfd9f
## explicit; go 1.20
k8s.io/gengo/v2
k8s.io/gengo/v2/codetags
k8s.io/gengo/v2/generator
k8s.io/gengo/v2/namer
k8s.io/gengo/v2/parser
k8s.io/gengo/v2/types
# k8s.io/klog v1.0.0
## explicit; go 1.12
k8s.io/klog