diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index eaa35f8d..1baa44de 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -268,655 +268,655 @@ }, { "ImportPath": "k8s.io/apimachinery/pkg/api/errors", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/meta", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/resource", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/internalversion", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1beta1", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/fields", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/labels", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/schema", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/streaming", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/selection", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/types", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/cache", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/clock", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/diff", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/errors", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/framer", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/intstr", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/json", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/mergepatch", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/net", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/runtime", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/sets", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/strategicpatch", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation/field", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/wait", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/yaml", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/version", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/pkg/watch", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/json", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect", - "Rev": "6426d21f392c6d0e710af98bdfe6fb7334b3e11a" + "Rev": "bd236513a4e35622d9007dff11eab07631645cd5" }, { "ImportPath": "k8s.io/client-go/discovery", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/discovery/fake", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/admissionregistration", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/admissionregistration/v1alpha1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/admissionregistration/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/apps", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/apps/v1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/apps/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/apps/v1beta2", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/autoscaling", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/autoscaling/v1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/autoscaling/v2beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/batch", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/batch/v1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/batch/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/batch/v2alpha1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/certificates", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/certificates/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/core", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/core/v1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/events", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/events/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/extensions", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/extensions/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/internalinterfaces", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/networking", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/networking/v1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/policy", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/policy/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/rbac", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/rbac/v1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/rbac/v1alpha1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/rbac/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/scheduling", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/scheduling/v1alpha1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/settings", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/settings/v1alpha1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/storage", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/storage/v1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/storage/v1alpha1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/informers/storage/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/scheme", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta2", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v2alpha1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/certificates/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/core/v1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/events/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/extensions/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/networking/v1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/policy/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/settings/v1alpha1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1alpha1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/listers/admissionregistration/v1alpha1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/listers/admissionregistration/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/listers/apps/v1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/listers/apps/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/listers/apps/v1beta2", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/listers/autoscaling/v1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/listers/autoscaling/v2beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/listers/batch/v1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/listers/batch/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/listers/batch/v2alpha1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/listers/certificates/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/listers/core/v1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/listers/events/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/listers/extensions/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/listers/networking/v1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/listers/policy/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/listers/rbac/v1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/listers/rbac/v1alpha1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/listers/rbac/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/listers/scheduling/v1alpha1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/listers/settings/v1alpha1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/listers/storage/v1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/listers/storage/v1alpha1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/listers/storage/v1beta1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/pkg/apis/clientauthentication", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/pkg/version", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/plugin/pkg/client/auth/exec", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/rest", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/rest/watch", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/testing", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/tools/auth", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/tools/cache", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/tools/clientcmd", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/tools/clientcmd/api", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/tools/clientcmd/api/latest", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/tools/clientcmd/api/v1", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/tools/metrics", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/tools/pager", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/tools/record", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/tools/reference", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/transport", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/util/buffer", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/util/cert", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/util/flowcontrol", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/util/homedir", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/util/integer", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/util/retry", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/client-go/util/workqueue", - "Rev": "01d6a1350dd5c61a498fd3a5bdafd9151cac4e9a" + "Rev": "7e5a9c2cb47b6f7eaf18e4a0484c48ea3932e7d3" }, { "ImportPath": "k8s.io/kube-openapi/pkg/util/proto", - "Rev": "50ae88d24ede7b8bad68e23c805b5d3da5c8abaf" + "Rev": "f08db293d3ef80052d6513ece19792642a289fea" } ] } diff --git a/vendor/k8s.io/apimachinery/pkg/util/diff/diff.go b/vendor/k8s.io/apimachinery/pkg/util/diff/diff.go index 3d5ec14b..bce95baf 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/diff/diff.go +++ b/vendor/k8s.io/apimachinery/pkg/util/diff/diff.go @@ -89,20 +89,52 @@ func ObjectReflectDiff(a, b interface{}) string { } out := []string{""} for _, d := range diffs { + elidedA, elidedB := limit(d.a, d.b, 80) out = append(out, fmt.Sprintf("%s:", d.path), - limit(fmt.Sprintf(" a: %#v", d.a), 80), - limit(fmt.Sprintf(" b: %#v", d.b), 80), + fmt.Sprintf(" a: %s", elidedA), + fmt.Sprintf(" b: %s", elidedB), ) } return strings.Join(out, "\n") } -func limit(s string, max int) string { - if len(s) > max { - return s[:max] +// limit: +// 1. stringifies aObj and bObj +// 2. elides identical prefixes if either is too long +// 3. elides remaining content from the end if either is too long +func limit(aObj, bObj interface{}, max int) (string, string) { + elidedPrefix := "" + elidedASuffix := "" + elidedBSuffix := "" + a, b := fmt.Sprintf("%#v", aObj), fmt.Sprintf("%#v", bObj) + for { + switch { + case len(a) > max && len(a) > 4 && len(b) > 4 && a[:4] == b[:4]: + // a is too long, b has data, and the first several characters are the same + elidedPrefix = "..." + a = a[2:] + b = b[2:] + + case len(b) > max && len(b) > 4 && len(a) > 4 && a[:4] == b[:4]: + // b is too long, a has data, and the first several characters are the same + elidedPrefix = "..." + a = a[2:] + b = b[2:] + + case len(a) > max: + a = a[:max] + elidedASuffix = "..." + + case len(b) > max: + b = b[:max] + elidedBSuffix = "..." + + default: + // both are short enough + return elidedPrefix + a + elidedASuffix, elidedPrefix + b + elidedBSuffix + } } - return s } func public(s string) bool { diff --git a/vendor/k8s.io/code-generator/Godeps/Godeps.json b/vendor/k8s.io/code-generator/Godeps/Godeps.json index 7a985fd9..1b3cb3e5 100644 --- a/vendor/k8s.io/code-generator/Godeps/Godeps.json +++ b/vendor/k8s.io/code-generator/Godeps/Godeps.json @@ -260,11 +260,11 @@ }, { "ImportPath": "k8s.io/kube-openapi/pkg/common", - "Rev": "50ae88d24ede7b8bad68e23c805b5d3da5c8abaf" + "Rev": "f08db293d3ef80052d6513ece19792642a289fea" }, { "ImportPath": "k8s.io/kube-openapi/pkg/generators", - "Rev": "50ae88d24ede7b8bad68e23c805b5d3da5c8abaf" + "Rev": "f08db293d3ef80052d6513ece19792642a289fea" } ] } diff --git a/vendor/k8s.io/code-generator/vendor/k8s.io/kube-openapi/pkg/common/common.go b/vendor/k8s.io/code-generator/vendor/k8s.io/kube-openapi/pkg/common/common.go index fbe01cab..0d235876 100644 --- a/vendor/k8s.io/code-generator/vendor/k8s.io/kube-openapi/pkg/common/common.go +++ b/vendor/k8s.io/code-generator/vendor/k8s.io/kube-openapi/pkg/common/common.go @@ -32,7 +32,7 @@ type OpenAPIDefinition struct { type ReferenceCallback func(path string) spec.Ref -// OpenAPIDefinitions is collection of all definitions. +// GetOpenAPIDefinitions is collection of all definitions. type GetOpenAPIDefinitions func(ReferenceCallback) map[string]OpenAPIDefinition // OpenAPIDefinitionGetter gets openAPI definitions for a given type. If a type implements this interface, diff --git a/vendor/k8s.io/code-generator/vendor/k8s.io/kube-openapi/pkg/generators/extension.go b/vendor/k8s.io/code-generator/vendor/k8s.io/kube-openapi/pkg/generators/extension.go new file mode 100644 index 00000000..7f360240 --- /dev/null +++ b/vendor/k8s.io/code-generator/vendor/k8s.io/kube-openapi/pkg/generators/extension.go @@ -0,0 +1,128 @@ +/* +Copyright 2018 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" + "sort" + "strings" + + "k8s.io/gengo/examples/set-gen/sets" + "k8s.io/gengo/types" +) + +const extensionPrefix = "x-kubernetes-" + +// Extension tag to openapi extension +var tagToExtension = map[string]string{ + "patchMergeKey": "x-kubernetes-patch-merge-key", + "patchStrategy": "x-kubernetes-patch-strategy", + "listType": "x-kubernetes-list-type", + "listMapKey": "x-kubernetes-list-map-keys", +} + +// Enum values per extension +var allowedExtensionValues = map[string]sets.String{ + "x-kubernetes-patch-strategy": sets.NewString("merge", "retainKeys"), + "x-kubernetes-list-type": sets.NewString("atomic", "set", "map"), +} + +// Extension encapsulates information necessary to generate an OpenAPI extension. +type extension struct { + idlTag string // Example: listType + xName string // Example: x-kubernetes-list-type + values []string // Example: [atomic] +} + +func (e extension) validateAllowedValues() error { + // allowedValues not set means no restrictions on values. + allowedValues, exists := allowedExtensionValues[e.xName] + if !exists { + return nil + } + // Check for missing value. + if len(e.values) == 0 { + return fmt.Errorf("%s needs a value, none given.", e.idlTag) + } + // For each extension value, validate that it is allowed. + if !allowedValues.HasAll(e.values...) { + return fmt.Errorf("%v not allowed for %s. Allowed values: %v", + e.values, e.idlTag, allowedValues.List()) + } + return nil +} + +func (e extension) hasMultipleValues() bool { + return len(e.values) > 1 +} + +// Returns sorted list of map keys. Needed for deterministic testing. +func sortedMapKeys(m map[string][]string) []string { + keys := make([]string, len(m)) + i := 0 + for k := range m { + keys[i] = k + i++ + } + sort.Strings(keys) + return keys +} + +// Parses comments to return openapi extensions. +// NOTE: Non-empty errors does not mean extensions is empty. +func parseExtensions(comments []string) ([]extension, []error) { + extensions := []extension{} + errors := []error{} + // First, generate extensions from "+k8s:openapi-gen=x-kubernetes-*" annotations. + values := getOpenAPITagValue(comments) + for _, val := range values { + // Example: x-kubernetes-member-tag:member_test + if strings.HasPrefix(val, extensionPrefix) { + parts := strings.SplitN(val, ":", 2) + if len(parts) != 2 { + errors = append(errors, fmt.Errorf("invalid extension value: %v", val)) + continue + } + e := extension{ + idlTag: tagName, // Example: k8s:openapi-gen + xName: parts[0], // Example: x-kubernetes-member-tag + values: []string{parts[1]}, // Example: member_test + } + extensions = append(extensions, e) + } + } + // Next, generate extensions from "idlTags" (e.g. +listType) + tagValues := types.ExtractCommentTags("+", comments) + for _, idlTag := range sortedMapKeys(tagValues) { + xName, exists := tagToExtension[idlTag] + if !exists { + continue + } + values := tagValues[idlTag] + e := extension{ + idlTag: idlTag, // listType + xName: xName, // x-kubernetes-list-type + values: values, // [atomic] + } + if err := e.validateAllowedValues(); err != nil { + // For now, only log the extension validation errors. + errors = append(errors, err) + } + extensions = append(extensions, e) + } + return extensions, errors +} diff --git a/vendor/k8s.io/code-generator/vendor/k8s.io/kube-openapi/pkg/generators/openapi.go b/vendor/k8s.io/code-generator/vendor/k8s.io/kube-openapi/pkg/generators/openapi.go index 73e367b3..deeac757 100644 --- a/vendor/k8s.io/code-generator/vendor/k8s.io/kube-openapi/pkg/generators/openapi.go +++ b/vendor/k8s.io/code-generator/vendor/k8s.io/kube-openapi/pkg/generators/openapi.go @@ -40,15 +40,17 @@ const tagOptional = "optional" // Known values for the tag. const ( - tagValueTrue = "true" - tagValueFalse = "false" - tagExtensionPrefix = "x-kubernetes-" - tagPatchStrategy = "patchStrategy" - tagPatchMergeKey = "patchMergeKey" - patchStrategyExtensionName = "patch-strategy" - patchMergeKeyExtensionName = "patch-merge-key" + tagValueTrue = "true" + tagValueFalse = "false" ) +// Used for temporary validation of patch struct tags. +// TODO: Remove patch struct tag validation because they we are now consuming OpenAPI on server. +var tempPatchTags = [...]string{ + "patchMergeKey", + "patchStrategy", +} + func getOpenAPITagValue(comments []string) []string { return types.ExtractCommentTags("+", comments)[tagName] } @@ -155,6 +157,7 @@ type openAPIGen struct { // TargetPackage is the package that will get GetOpenAPIDefinitions function returns all open API definitions. targetPackage string imports namer.ImportTracker + types []*types.Type context *generator.Context } @@ -169,10 +172,18 @@ func NewOpenAPIGen(sanitizedName string, targetPackage string, context *generato } } +const nameTmpl = "schema_$.type|private$" + func (g *openAPIGen) 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), + "private": &namer.NameStrategy{ + Join: func(pre string, in []string, post string) string { + return strings.Join(in, "_") + }, + PrependPackageNames: 4, // enough to fully qualify from k8s.io/api/... + }, } } @@ -181,6 +192,7 @@ func (g *openAPIGen) Filter(c *generator.Context, t *types.Type) bool { if strings.HasPrefix(t.Name.Name, "codecSelfer") { return false } + g.types = append(g.types, t) return true } @@ -215,13 +227,17 @@ func (g *openAPIGen) Init(c *generator.Context, w io.Writer) error { sw := generator.NewSnippetWriter(w, c, "$", "$") sw.Do("func GetOpenAPIDefinitions(ref $.ReferenceCallback|raw$) map[string]$.OpenAPIDefinition|raw$ {\n", argsFromType(nil)) sw.Do("return map[string]$.OpenAPIDefinition|raw${\n", argsFromType(nil)) - return sw.Error() -} -func (g *openAPIGen) Finalize(c *generator.Context, w io.Writer) error { - sw := generator.NewSnippetWriter(w, c, "$", "$") - sw.Do("}\n", nil) + for _, t := range g.types { + err := newOpenAPITypeWriter(sw).generateCall(t) + if err != nil { + return err + } + } + sw.Do("}\n", nil) + sw.Do("}\n\n", nil) + return sw.Error() } @@ -243,10 +259,6 @@ func getJsonTags(m *types.Member) []string { return strings.Split(jsonTag, ",") } -func getPatchTags(m *types.Member) (string, string) { - return reflect.StructTag(m.Tags).Get(tagPatchMergeKey), reflect.StructTag(m.Tags).Get(tagPatchStrategy) -} - func getReferableName(m *types.Member) string { jsonTags := getJsonTags(m) if len(jsonTags) > 0 { @@ -342,7 +354,7 @@ func (g openAPITypeWriter) generateMembers(t *types.Type, required []string) ([] return required, nil } -func (g openAPITypeWriter) generate(t *types.Type) error { +func (g openAPITypeWriter) generateCall(t *types.Type) error { // Only generate for struct type and ignore the rest switch t.Kind { case types.Struct: @@ -350,31 +362,36 @@ func (g openAPITypeWriter) generate(t *types.Type) error { g.Do("\"$.$\": ", t.Name) if hasOpenAPIDefinitionMethod(t) { g.Do("$.type|raw${}.OpenAPIDefinition(),\n", args) + } else { + g.Do(nameTmpl+"(ref),\n", args) + } + } + return g.Error() +} + +func (g openAPITypeWriter) generate(t *types.Type) error { + // Only generate for struct type and ignore the rest + switch t.Kind { + case types.Struct: + if hasOpenAPIDefinitionMethod(t) { + // already invoked directly return nil } + + args := argsFromType(t) + g.Do("func "+nameTmpl+"(ref $.ReferenceCallback|raw$) $.OpenAPIDefinition|raw$ {\n", args) if hasOpenAPIDefinitionMethods(t) { - // Since this generated snippet is part of a map: - // - // map[string]common.OpenAPIDefinition: { - // "TYPE_NAME": { - // Schema: spec.Schema{ ... }, - // }, - // } - // - // For compliance with gofmt -s it's important we elide the - // struct type. The type is implied by the map and will be - // removed otherwise. - g.Do("{\n"+ + g.Do("return $.OpenAPIDefinition|raw${\n"+ "Schema: spec.Schema{\n"+ "SchemaProps: spec.SchemaProps{\n"+ "Type:$.type|raw${}.OpenAPISchemaType(),\n"+ "Format:$.type|raw${}.OpenAPISchemaFormat(),\n"+ "},\n"+ "},\n"+ - "},\n", args) + "}\n}\n\n", args) return nil } - g.Do("{\nSchema: spec.Schema{\nSchemaProps: spec.SchemaProps{\n", nil) + g.Do("return $.OpenAPIDefinition|raw${\nSchema: spec.Schema{\nSchemaProps: spec.SchemaProps{\n", args) g.generateDescription(t.CommentLines) g.Do("Properties: map[string]$.SpecSchemaType|raw${\n", args) required, err := g.generateMembers(t, []string{}) @@ -386,7 +403,7 @@ func (g openAPITypeWriter) generate(t *types.Type) error { g.Do("Required: []string{\"$.$\"},\n", strings.Join(required, "\",\"")) } g.Do("},\n", nil) - if err := g.generateExtensions(t.CommentLines); err != nil { + if err := g.generateStructExtensions(t); err != nil { return err } g.Do("},\n", nil) @@ -406,70 +423,74 @@ func (g openAPITypeWriter) generate(t *types.Type) error { } g.Do("\"$.$\",", k) } - g.Do("},\n},\n", nil) + g.Do("},\n}\n}\n\n", nil) } return nil } -func (g openAPITypeWriter) generateExtensions(CommentLines []string) error { - tagValues := getOpenAPITagValue(CommentLines) - type NameValue struct { - Name, Value string - } - extensions := []NameValue{} - for _, val := range tagValues { - if strings.HasPrefix(val, tagExtensionPrefix) { - parts := strings.SplitN(val, ":", 2) - if len(parts) != 2 { - return fmt.Errorf("invalid extension value: %v", val) - } - extensions = append(extensions, NameValue{parts[0], parts[1]}) +func (g openAPITypeWriter) generateStructExtensions(t *types.Type) error { + extensions, errors := parseExtensions(t.CommentLines) + // Initially, we will only log struct extension errors. + if len(errors) > 0 { + for e := range errors { + glog.V(2).Infof("[%s]: %s\n", t.String(), e) } } - patchMergeKeyTag, err := getSingleTagsValue(CommentLines, tagPatchMergeKey) - if err != nil { - return err - } - if len(patchMergeKeyTag) > 0 { - extensions = append(extensions, NameValue{tagExtensionPrefix + patchMergeKeyExtensionName, patchMergeKeyTag}) - } - patchStrategyTag, err := getSingleTagsValue(CommentLines, tagPatchStrategy) - if err != nil { - return err - } - if len(patchStrategyTag) > 0 { - extensions = append(extensions, NameValue{tagExtensionPrefix + patchStrategyExtensionName, patchStrategyTag}) + // TODO(seans3): Validate struct extensions here. + g.emitExtensions(extensions) + return nil +} + +func (g openAPITypeWriter) generateMemberExtensions(m *types.Member, parent *types.Type) error { + extensions, errors := parseExtensions(m.CommentLines) + // Initially, we will only log member extension errors. + if len(errors) > 0 { + errorPrefix := fmt.Sprintf("[%s] %s:", parent.String(), m.String()) + for e := range errors { + glog.V(2).Infof("%s %s\n", errorPrefix, e) + } } + // TODO(seans3): Validate member extensions here. + // Example: listType extension is only on a Slice. + // Example: cross-extension validation - listMapKey only makes sense with listType=map + g.emitExtensions(extensions) + return nil +} + +func (g openAPITypeWriter) emitExtensions(extensions []extension) { + // If any extensions exist, then emit code to create them. if len(extensions) == 0 { - return nil + return } g.Do("VendorExtensible: spec.VendorExtensible{\nExtensions: spec.Extensions{\n", nil) for _, extension := range extensions { - g.Do("\"$.$\": ", extension.Name) - g.Do("\"$.$\",\n", extension.Value) + g.Do("\"$.$\": ", extension.xName) + if extension.hasMultipleValues() { + g.Do("[]string{\n", nil) + } + for _, value := range extension.values { + g.Do("\"$.$\",\n", value) + } + if extension.hasMultipleValues() { + g.Do("},\n", nil) + } } g.Do("},\n},\n", nil) - return nil } // TODO(#44005): Move this validation outside of this generator (probably to policy verifier) func (g openAPITypeWriter) validatePatchTags(m *types.Member, parent *types.Type) error { - patchMergeKeyStructTag, patchStrategyStructTag := getPatchTags(m) - patchMergeKeyCommentTag, err := getSingleTagsValue(m.CommentLines, tagPatchMergeKey) - if err != nil { - return err - } - patchStrategyCommentTag, err := getSingleTagsValue(m.CommentLines, tagPatchStrategy) - if err != nil { - return err - } - if patchMergeKeyStructTag != patchMergeKeyCommentTag { - return fmt.Errorf("patchMergeKey in comment and struct tags should match for member (%s) of (%s)", - m.Name, parent.Name.String()) - } - if patchStrategyStructTag != patchStrategyCommentTag { - return fmt.Errorf("patchStrategy in comment and struct tags should match for member (%s) of (%s)", - m.Name, parent.Name.String()) + // TODO: Remove patch struct tag validation because they we are now consuming OpenAPI on server. + for _, tagKey := range tempPatchTags { + structTagValue := reflect.StructTag(m.Tags).Get(tagKey) + commentTagValue, err := getSingleTagsValue(m.CommentLines, tagKey) + if err != nil { + return err + } + if structTagValue != commentTagValue { + return fmt.Errorf("Tags in comment and struct should match for member (%s) of (%s)", + m.Name, parent.Name.String()) + } } return nil } @@ -526,7 +547,7 @@ func (g openAPITypeWriter) generateProperty(m *types.Member, parent *types.Type) return err } g.Do("\"$.$\": {\n", name) - if err := g.generateExtensions(m.CommentLines); err != nil { + if err := g.generateMemberExtensions(m, parent); err != nil { return err } g.Do("SchemaProps: spec.SchemaProps{\n", nil)