Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
e2ca575d
Commit
e2ca575d
authored
Nov 09, 2018
by
Mehdy Bohlool
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
CRD Conversion
parent
ea54a0c5
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
121 additions
and
31 deletions
+121
-31
apiextensions.go
cmd/kube-apiserver/app/apiextensions.go
+5
-0
server.go
cmd/kube-apiserver/app/server.go
+2
-1
apiserver.go
...k8s.io/apiextensions-apiserver/pkg/apiserver/apiserver.go
+12
-1
converter.go
...xtensions-apiserver/pkg/apiserver/conversion/converter.go
+51
-16
nop_converter.go
...sions-apiserver/pkg/apiserver/conversion/nop_converter.go
+3
-3
webhook_converter.go
...s-apiserver/pkg/apiserver/conversion/webhook_converter.go
+0
-0
customresource_handler.go
...ensions-apiserver/pkg/apiserver/customresource_handler.go
+16
-3
customresource_handler_test.go
...ns-apiserver/pkg/apiserver/customresource_handler_test.go
+12
-2
options.go
...apiextensions-apiserver/pkg/cmd/server/options/options.go
+14
-0
helpers.go
...8s.io/apiextensions-apiserver/test/integration/helpers.go
+2
-2
validation_test.go
...iextensions-apiserver/test/integration/validation_test.go
+1
-1
versioning_test.go
...iextensions-apiserver/test/integration/versioning_test.go
+1
-1
webhook.go
...apiserver/pkg/admission/plugin/webhook/generic/webhook.go
+1
-0
crd_conversion_webhook.go
test/e2e/apimachinery/crd_conversion_webhook.go
+1
-1
No files found.
cmd/kube-apiserver/app/apiextensions.go
View file @
e2ca575d
...
...
@@ -28,6 +28,7 @@ import (
genericapiserver
"k8s.io/apiserver/pkg/server"
genericoptions
"k8s.io/apiserver/pkg/server/options"
utilfeature
"k8s.io/apiserver/pkg/util/feature"
"k8s.io/apiserver/pkg/util/webhook"
kubeexternalinformers
"k8s.io/client-go/informers"
"k8s.io/kubernetes/cmd/kube-apiserver/app/options"
)
...
...
@@ -38,6 +39,8 @@ func createAPIExtensionsConfig(
pluginInitializers
[]
admission
.
PluginInitializer
,
commandOptions
*
options
.
ServerRunOptions
,
masterCount
int
,
serviceResolver
webhook
.
ServiceResolver
,
authResolverWrapper
webhook
.
AuthenticationInfoResolverWrapper
,
)
(
*
apiextensionsapiserver
.
Config
,
error
)
{
// make a shallow copy to let us twiddle a few things
// most of the config actually remains the same. We only need to mess with a couple items related to the particulars of the apiextensions
...
...
@@ -74,6 +77,8 @@ func createAPIExtensionsConfig(
ExtraConfig
:
apiextensionsapiserver
.
ExtraConfig
{
CRDRESTOptionsGetter
:
apiextensionsoptions
.
NewCRDRESTOptionsGetter
(
etcdOptions
),
MasterCount
:
masterCount
,
AuthResolverWrapper
:
authResolverWrapper
,
ServiceResolver
:
serviceResolver
,
},
}
...
...
cmd/kube-apiserver/app/server.go
View file @
e2ca575d
...
...
@@ -165,7 +165,8 @@ func CreateServerChain(completedOptions completedServerRunOptions, stopCh <-chan
}
// If additional API servers are added, they should be gated.
apiExtensionsConfig
,
err
:=
createAPIExtensionsConfig
(
*
kubeAPIServerConfig
.
GenericConfig
,
kubeAPIServerConfig
.
ExtraConfig
.
VersionedInformers
,
pluginInitializer
,
completedOptions
.
ServerRunOptions
,
completedOptions
.
MasterCount
)
apiExtensionsConfig
,
err
:=
createAPIExtensionsConfig
(
*
kubeAPIServerConfig
.
GenericConfig
,
kubeAPIServerConfig
.
ExtraConfig
.
VersionedInformers
,
pluginInitializer
,
completedOptions
.
ServerRunOptions
,
completedOptions
.
MasterCount
,
serviceResolver
,
webhook
.
NewDefaultAuthenticationInfoResolverWrapper
(
proxyTransport
,
kubeAPIServerConfig
.
GenericConfig
.
LoopbackClientConfig
))
if
err
!=
nil
{
return
nil
,
err
}
...
...
staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/apiserver.go
View file @
e2ca575d
...
...
@@ -31,6 +31,7 @@ import (
"k8s.io/apiserver/pkg/registry/rest"
genericapiserver
"k8s.io/apiserver/pkg/server"
serverstorage
"k8s.io/apiserver/pkg/server/storage"
"k8s.io/apiserver/pkg/util/webhook"
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install"
...
...
@@ -78,6 +79,11 @@ type ExtraConfig struct {
// MasterCount is used to detect whether cluster is HA, and if it is
// the CRD Establishing will be hold by 5 seconds.
MasterCount
int
// ServiceResolver is used in CR webhook converters to resolve webhook's service names
ServiceResolver
webhook
.
ServiceResolver
// AuthResolverWrapper is used in CR webhook converters
AuthResolverWrapper
webhook
.
AuthenticationInfoResolverWrapper
}
type
Config
struct
{
...
...
@@ -167,7 +173,7 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget)
delegate
:
delegateHandler
,
}
establishingController
:=
establish
.
NewEstablishingController
(
s
.
Informers
.
Apiextensions
()
.
InternalVersion
()
.
CustomResourceDefinitions
(),
crdClient
.
Apiextensions
())
crdHandler
:=
NewCustomResourceDefinitionHandler
(
crdHandler
,
err
:=
NewCustomResourceDefinitionHandler
(
versionDiscoveryHandler
,
groupDiscoveryHandler
,
s
.
Informers
.
Apiextensions
()
.
InternalVersion
()
.
CustomResourceDefinitions
(),
...
...
@@ -175,8 +181,13 @@ func (c completedConfig) New(delegationTarget genericapiserver.DelegationTarget)
c
.
ExtraConfig
.
CRDRESTOptionsGetter
,
c
.
GenericConfig
.
AdmissionControl
,
establishingController
,
c
.
ExtraConfig
.
ServiceResolver
,
c
.
ExtraConfig
.
AuthResolverWrapper
,
c
.
ExtraConfig
.
MasterCount
,
)
if
err
!=
nil
{
return
nil
,
err
}
s
.
GenericAPIServer
.
Handler
.
NonGoRestfulMux
.
Handle
(
"/apis"
,
crdHandler
)
s
.
GenericAPIServer
.
Handler
.
NonGoRestfulMux
.
HandlePrefix
(
"/apis/"
,
crdHandler
)
...
...
staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/converter.go
View file @
e2ca575d
...
...
@@ -20,39 +20,74 @@ import (
"fmt"
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
apiextensionsfeatures
"k8s.io/apiextensions-apiserver/pkg/features"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
utilfeature
"k8s.io/apiserver/pkg/util/feature"
"k8s.io/apiserver/pkg/util/webhook"
)
// NewCRDConverter returns a new CRD converter based on the conversion settings in crd object.
func
NewCRDConverter
(
crd
*
apiextensions
.
CustomResourceDefinition
)
(
safe
,
unsafe
runtime
.
ObjectConvertor
)
{
// CRConverterFactory is the factory for all CR converters.
type
CRConverterFactory
struct
{
// webhookConverterFactory is the factory for webhook converters.
// This field should not be used if CustomResourceWebhookConversion feature is disabled.
webhookConverterFactory
*
webhookConverterFactory
}
// NewCRConverterFactory creates a new CRConverterFactory
func
NewCRConverterFactory
(
serviceResolver
webhook
.
ServiceResolver
,
authResolverWrapper
webhook
.
AuthenticationInfoResolverWrapper
)
(
*
CRConverterFactory
,
error
)
{
converterFactory
:=
&
CRConverterFactory
{}
if
utilfeature
.
DefaultFeatureGate
.
Enabled
(
apiextensionsfeatures
.
CustomResourceWebhookConversion
)
{
webhookConverterFactory
,
err
:=
newWebhookConverterFactory
(
serviceResolver
,
authResolverWrapper
)
if
err
!=
nil
{
return
nil
,
err
}
converterFactory
.
webhookConverterFactory
=
webhookConverterFactory
}
return
converterFactory
,
nil
}
// NewConverter returns a new CR converter based on the conversion settings in crd object.
func
(
m
*
CRConverterFactory
)
NewConverter
(
crd
*
apiextensions
.
CustomResourceDefinition
)
(
safe
,
unsafe
runtime
.
ObjectConvertor
,
err
error
)
{
validVersions
:=
map
[
schema
.
GroupVersion
]
bool
{}
for
_
,
version
:=
range
crd
.
Spec
.
Versions
{
validVersions
[
schema
.
GroupVersion
{
Group
:
crd
.
Spec
.
Group
,
Version
:
version
.
Name
}]
=
true
}
// The only converter right now is nopConverter. More converters will be returned based on the
// CRD object when they introduced.
unsafe
=
&
crdConverter
{
clusterScoped
:
crd
.
Spec
.
Scope
==
apiextensions
.
ClusterScoped
,
delegate
:
&
nopConverter
{
validVersions
:
validVersions
,
},
switch
crd
.
Spec
.
Conversion
.
Strategy
{
case
apiextensions
.
NoneConverter
:
unsafe
=
&
crConverter
{
clusterScoped
:
crd
.
Spec
.
Scope
==
apiextensions
.
ClusterScoped
,
delegate
:
&
nopConverter
{
validVersions
:
validVersions
,
},
}
return
&
safeConverterWrapper
{
unsafe
},
unsafe
,
nil
case
apiextensions
.
WebhookConverter
:
if
!
utilfeature
.
DefaultFeatureGate
.
Enabled
(
apiextensionsfeatures
.
CustomResourceWebhookConversion
)
{
return
nil
,
nil
,
fmt
.
Errorf
(
"webhook conversion is disabled on this cluster"
)
}
unsafe
,
err
:=
m
.
webhookConverterFactory
.
NewWebhookConverter
(
validVersions
,
crd
)
if
err
!=
nil
{
return
nil
,
nil
,
err
}
return
&
safeConverterWrapper
{
unsafe
},
unsafe
,
nil
}
return
&
safeConverterWrapper
{
unsafe
},
unsafe
return
nil
,
nil
,
fmt
.
Errorf
(
"unknown conversion strategy %q for CRD %s"
,
crd
.
Spec
.
Conversion
.
Strategy
,
crd
.
Name
)
}
var
_
runtime
.
ObjectConvertor
=
&
cr
d
Converter
{}
var
_
runtime
.
ObjectConvertor
=
&
crConverter
{}
// cr
dConverter extends the delegate with generic CRD
conversion behaviour. The delegate will implement the
// cr
Converter extends the delegate with generic CR
conversion behaviour. The delegate will implement the
// user defined conversion strategy given in the CustomResourceDefinition.
type
cr
d
Converter
struct
{
type
crConverter
struct
{
delegate
runtime
.
ObjectConvertor
clusterScoped
bool
}
func
(
c
*
cr
d
Converter
)
ConvertFieldLabel
(
gvk
schema
.
GroupVersionKind
,
label
,
value
string
)
(
string
,
string
,
error
)
{
func
(
c
*
crConverter
)
ConvertFieldLabel
(
gvk
schema
.
GroupVersionKind
,
label
,
value
string
)
(
string
,
string
,
error
)
{
// We currently only support metadata.namespace and metadata.name.
switch
{
case
label
==
"metadata.name"
:
...
...
@@ -64,12 +99,12 @@ func (c *crdConverter) ConvertFieldLabel(gvk schema.GroupVersionKind, label, val
}
}
func
(
c
*
cr
d
Converter
)
Convert
(
in
,
out
,
context
interface
{})
error
{
func
(
c
*
crConverter
)
Convert
(
in
,
out
,
context
interface
{})
error
{
return
c
.
delegate
.
Convert
(
in
,
out
,
context
)
}
// ConvertToVersion converts in object to the given gvk in place and returns the same `in` object.
func
(
c
*
cr
d
Converter
)
ConvertToVersion
(
in
runtime
.
Object
,
target
runtime
.
GroupVersioner
)
(
runtime
.
Object
,
error
)
{
func
(
c
*
crConverter
)
ConvertToVersion
(
in
runtime
.
Object
,
target
runtime
.
GroupVersioner
)
(
runtime
.
Object
,
error
)
{
// Run the converter on the list items instead of list itself
if
list
,
ok
:=
in
.
(
*
unstructured
.
UnstructuredList
);
ok
{
for
i
:=
range
list
.
Items
{
...
...
staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/nop_converter.go
View file @
e2ca575d
...
...
@@ -49,11 +49,11 @@ func (c *nopConverter) Convert(in, out, context interface{}) error {
outGVK
:=
unstructOut
.
GroupVersionKind
()
if
!
c
.
validVersions
[
outGVK
.
GroupVersion
()]
{
return
fmt
.
Errorf
(
"request to convert CR
D
from an invalid group/version: %s"
,
outGVK
.
String
())
return
fmt
.
Errorf
(
"request to convert CR from an invalid group/version: %s"
,
outGVK
.
String
())
}
inGVK
:=
unstructIn
.
GroupVersionKind
()
if
!
c
.
validVersions
[
inGVK
.
GroupVersion
()]
{
return
fmt
.
Errorf
(
"request to convert CR
D
to an invalid group/version: %s"
,
inGVK
.
String
())
return
fmt
.
Errorf
(
"request to convert CR to an invalid group/version: %s"
,
inGVK
.
String
())
}
unstructOut
.
SetUnstructuredContent
(
unstructIn
.
UnstructuredContent
())
...
...
@@ -72,7 +72,7 @@ func (c *nopConverter) ConvertToVersion(in runtime.Object, target runtime.GroupV
return
nil
,
fmt
.
Errorf
(
"%v is unstructured and is not suitable for converting to %q"
,
kind
,
target
)
}
if
!
c
.
validVersions
[
gvk
.
GroupVersion
()]
{
return
nil
,
fmt
.
Errorf
(
"request to convert CR
D
to an invalid group/version: %s"
,
gvk
.
String
())
return
nil
,
fmt
.
Errorf
(
"request to convert CR to an invalid group/version: %s"
,
gvk
.
String
())
}
in
.
GetObjectKind
()
.
SetGroupVersionKind
(
gvk
)
return
in
,
nil
...
...
staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/webhook_converter.go
0 → 100644
View file @
e2ca575d
This diff is collapsed.
Click to expand it.
staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler.go
View file @
e2ca575d
...
...
@@ -67,6 +67,7 @@ import (
apiextensionsfeatures
"k8s.io/apiextensions-apiserver/pkg/features"
"k8s.io/apiextensions-apiserver/pkg/registry/customresource"
"k8s.io/apiextensions-apiserver/pkg/registry/customresource/tableconvertor"
"k8s.io/apiserver/pkg/util/webhook"
)
// crdHandler serves the `/apis` endpoint.
...
...
@@ -93,6 +94,8 @@ type crdHandler struct {
// MasterCount is used to implement sleep to improve
// CRD establishing process for HA clusters.
masterCount
int
converterFactory
*
conversion
.
CRConverterFactory
}
// crdInfo stores enough information to serve the storage for the custom resource
...
...
@@ -129,7 +132,9 @@ func NewCustomResourceDefinitionHandler(
restOptionsGetter
generic
.
RESTOptionsGetter
,
admission
admission
.
Interface
,
establishingController
*
establish
.
EstablishingController
,
masterCount
int
)
*
crdHandler
{
serviceResolver
webhook
.
ServiceResolver
,
authResolverWrapper
webhook
.
AuthenticationInfoResolverWrapper
,
masterCount
int
)
(
*
crdHandler
,
error
)
{
ret
:=
&
crdHandler
{
versionDiscoveryHandler
:
versionDiscoveryHandler
,
groupDiscoveryHandler
:
groupDiscoveryHandler
,
...
...
@@ -147,10 +152,15 @@ func NewCustomResourceDefinitionHandler(
ret
.
removeDeadStorage
()
},
})
crConverterFactory
,
err
:=
conversion
.
NewCRConverterFactory
(
serviceResolver
,
authResolverWrapper
)
if
err
!=
nil
{
return
nil
,
err
}
ret
.
converterFactory
=
crConverterFactory
ret
.
customStorage
.
Store
(
crdStorageMap
{})
return
ret
return
ret
,
nil
}
func
(
r
*
crdHandler
)
ServeHTTP
(
w
http
.
ResponseWriter
,
req
*
http
.
Request
)
{
...
...
@@ -433,7 +443,10 @@ func (r *crdHandler) getOrCreateServingInfoFor(crd *apiextensions.CustomResource
scaleScopes
:=
map
[
string
]
handlers
.
RequestScope
{}
for
_
,
v
:=
range
crd
.
Spec
.
Versions
{
safeConverter
,
unsafeConverter
:=
conversion
.
NewCRDConverter
(
crd
)
safeConverter
,
unsafeConverter
,
err
:=
r
.
converterFactory
.
NewConverter
(
crd
)
if
err
!=
nil
{
return
nil
,
err
}
// In addition to Unstructured objects (Custom Resources), we also may sometimes need to
// decode unversioned Options objects, so we delegate to parameterScheme for such types.
parameterScheme
:=
runtime
.
NewScheme
()
...
...
staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/customresource_handler_test.go
View file @
e2ca575d
...
...
@@ -79,14 +79,24 @@ func TestConvertFieldLabel(t *testing.T) {
for
_
,
test
:=
range
tests
{
t
.
Run
(
test
.
name
,
func
(
t
*
testing
.
T
)
{
crd
:=
apiextensions
.
CustomResourceDefinition
{}
crd
:=
apiextensions
.
CustomResourceDefinition
{
Spec
:
apiextensions
.
CustomResourceDefinitionSpec
{
Conversion
:
&
apiextensions
.
CustomResourceConversion
{
Strategy
:
"None"
,
},
},
}
if
test
.
clusterScoped
{
crd
.
Spec
.
Scope
=
apiextensions
.
ClusterScoped
}
else
{
crd
.
Spec
.
Scope
=
apiextensions
.
NamespaceScoped
}
_
,
c
:=
conversion
.
NewCRDConverter
(
&
crd
)
f
,
err
:=
conversion
.
NewCRConverterFactory
(
nil
,
nil
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
_
,
c
,
err
:=
f
.
NewConverter
(
&
crd
)
label
,
value
,
err
:=
c
.
ConvertFieldLabel
(
schema
.
GroupVersionKind
{},
test
.
label
,
"value"
)
if
e
,
a
:=
test
.
expectError
,
err
!=
nil
;
e
!=
a
{
...
...
staging/src/k8s.io/apiextensions-apiserver/pkg/cmd/server/options/options.go
View file @
e2ca575d
...
...
@@ -20,6 +20,7 @@ import (
"fmt"
"io"
"net"
"net/url"
"github.com/spf13/pflag"
...
...
@@ -30,6 +31,9 @@ import (
genericregistry
"k8s.io/apiserver/pkg/registry/generic"
genericapiserver
"k8s.io/apiserver/pkg/server"
genericoptions
"k8s.io/apiserver/pkg/server/options"
"k8s.io/apiserver/pkg/util/proxy"
"k8s.io/apiserver/pkg/util/webhook"
"k8s.io/client-go/listers/core/v1"
)
const
defaultEtcdPathPrefix
=
"/registry/apiextensions.kubernetes.io"
...
...
@@ -94,6 +98,8 @@ func (o CustomResourceDefinitionsServerOptions) Config() (*apiserver.Config, err
GenericConfig
:
serverConfig
,
ExtraConfig
:
apiserver
.
ExtraConfig
{
CRDRESTOptionsGetter
:
NewCRDRESTOptionsGetter
(
*
o
.
RecommendedOptions
.
Etcd
),
ServiceResolver
:
&
serviceResolver
{
serverConfig
.
SharedInformerFactory
.
Core
()
.
V1
()
.
Services
()
.
Lister
()},
AuthResolverWrapper
:
webhook
.
NewDefaultAuthenticationInfoResolverWrapper
(
nil
,
serverConfig
.
LoopbackClientConfig
),
},
}
return
config
,
nil
...
...
@@ -114,3 +120,11 @@ func NewCRDRESTOptionsGetter(etcdOptions genericoptions.EtcdOptions) genericregi
return
ret
}
type
serviceResolver
struct
{
services
v1
.
ServiceLister
}
func
(
r
*
serviceResolver
)
ResolveEndpoint
(
namespace
,
name
string
)
(
*
url
.
URL
,
error
)
{
return
proxy
.
ResolveCluster
(
r
.
services
,
namespace
,
name
)
}
staging/src/k8s.io/apiextensions-apiserver/test/integration/helpers.go
View file @
e2ca575d
...
...
@@ -76,8 +76,8 @@ func newNamespacedCustomResourceClient(ns string, client dynamic.Interface, crd
return
newNamespacedCustomResourceVersionedClient
(
ns
,
client
,
crd
,
crd
.
Spec
.
Versions
[
0
]
.
Name
)
}
//
u
pdateCustomResourceDefinitionWithRetry updates a CRD, retrying up to 5 times on version conflict errors.
func
u
pdateCustomResourceDefinitionWithRetry
(
client
clientset
.
Interface
,
name
string
,
update
func
(
*
apiextensionsv1beta1
.
CustomResourceDefinition
))
(
*
apiextensionsv1beta1
.
CustomResourceDefinition
,
error
)
{
//
U
pdateCustomResourceDefinitionWithRetry updates a CRD, retrying up to 5 times on version conflict errors.
func
U
pdateCustomResourceDefinitionWithRetry
(
client
clientset
.
Interface
,
name
string
,
update
func
(
*
apiextensionsv1beta1
.
CustomResourceDefinition
))
(
*
apiextensionsv1beta1
.
CustomResourceDefinition
,
error
)
{
for
i
:=
0
;
i
<
5
;
i
++
{
crd
,
err
:=
client
.
ApiextensionsV1beta1
()
.
CustomResourceDefinitions
()
.
Get
(
name
,
metav1
.
GetOptions
{})
if
err
!=
nil
{
...
...
staging/src/k8s.io/apiextensions-apiserver/test/integration/validation_test.go
View file @
e2ca575d
...
...
@@ -445,7 +445,7 @@ func TestCRValidationOnCRDUpdate(t *testing.T) {
}
// update the CRD to a less stricter schema
_
,
err
=
u
pdateCustomResourceDefinitionWithRetry
(
apiExtensionClient
,
"noxus.mygroup.example.com"
,
func
(
crd
*
apiextensionsv1beta1
.
CustomResourceDefinition
)
{
_
,
err
=
U
pdateCustomResourceDefinitionWithRetry
(
apiExtensionClient
,
"noxus.mygroup.example.com"
,
func
(
crd
*
apiextensionsv1beta1
.
CustomResourceDefinition
)
{
validationSchema
,
err
:=
getSchemaForVersion
(
crd
,
v
.
Name
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
...
...
staging/src/k8s.io/apiextensions-apiserver/test/integration/versioning_test.go
View file @
e2ca575d
...
...
@@ -64,7 +64,7 @@ func TestInternalVersionIsHandlerVersion(t *testing.T) {
// update validation via update because the cache priming in CreateNewCustomResourceDefinition will fail otherwise
t
.
Logf
(
"Updating CRD to validate apiVersion"
)
noxuDefinition
,
err
=
u
pdateCustomResourceDefinitionWithRetry
(
apiExtensionClient
,
noxuDefinition
.
Name
,
func
(
crd
*
apiextensionsv1beta1
.
CustomResourceDefinition
)
{
noxuDefinition
,
err
=
U
pdateCustomResourceDefinitionWithRetry
(
apiExtensionClient
,
noxuDefinition
.
Name
,
func
(
crd
*
apiextensionsv1beta1
.
CustomResourceDefinition
)
{
crd
.
Spec
.
Validation
=
&
apiextensionsv1beta1
.
CustomResourceValidation
{
OpenAPIV3Schema
:
&
apiextensionsv1beta1
.
JSONSchemaProps
{
Properties
:
map
[
string
]
apiextensionsv1beta1
.
JSONSchemaProps
{
...
...
staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/generic/webhook.go
View file @
e2ca575d
...
...
@@ -164,6 +164,7 @@ func (a *Webhook) Dispatch(attr admission.Attributes) error {
return
admission
.
NewForbidden
(
attr
,
fmt
.
Errorf
(
"not yet ready to handle request"
))
}
hooks
:=
a
.
hookSource
.
Webhooks
()
// TODO: Figure out if adding one second timeout make sense here.
ctx
:=
context
.
TODO
()
var
relevantHooks
[]
*
v1beta1
.
Webhook
...
...
test/e2e/apimachinery/crd_conversion_webhook.go
View file @
e2ca575d
...
...
@@ -17,13 +17,13 @@ limitations under the License.
package
apimachinery
import
(
"k8s.io/kubernetes/staging/src/k8s.io/apiextensions-apiserver/test/integration"
"time"
apps
"k8s.io/api/apps/v1"
"k8s.io/api/core/v1"
rbacv1
"k8s.io/api/rbac/v1"
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
"k8s.io/apiextensions-apiserver/test/integration"
"k8s.io/apimachinery/pkg/api/errors"
metav1
"k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment