mirror of
https://github.com/ceph/ceph-csi.git
synced 2025-06-14 02:43:36 +00:00
224
vendor/github.com/kubernetes-csi/csi-lib-utils/protosanitizer/protosanitizer_test.go
generated
vendored
224
vendor/github.com/kubernetes-csi/csi-lib-utils/protosanitizer/protosanitizer_test.go
generated
vendored
@ -1,224 +0,0 @@
|
||||
/*
|
||||
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 protosanitizer
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
"github.com/golang/protobuf/proto"
|
||||
csi03 "github.com/kubernetes-csi/csi-lib-utils/protosanitizer/test/csi03"
|
||||
csi "github.com/kubernetes-csi/csi-lib-utils/protosanitizer/test/csi10"
|
||||
"github.com/kubernetes-csi/csi-lib-utils/protosanitizer/test/csitest"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestStripSecrets(t *testing.T) {
|
||||
secretName := "secret-abc"
|
||||
secretValue := "123"
|
||||
|
||||
// CSI 0.3.0.
|
||||
createVolumeCSI03 := &csi03.CreateVolumeRequest{
|
||||
AccessibilityRequirements: &csi03.TopologyRequirement{
|
||||
Requisite: []*csi03.Topology{
|
||||
&csi03.Topology{
|
||||
Segments: map[string]string{
|
||||
"foo": "bar",
|
||||
"x": "y",
|
||||
},
|
||||
},
|
||||
&csi03.Topology{
|
||||
Segments: map[string]string{
|
||||
"a": "b",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
Name: "foo",
|
||||
VolumeCapabilities: []*csi03.VolumeCapability{
|
||||
&csi03.VolumeCapability{
|
||||
AccessType: &csi03.VolumeCapability_Mount{
|
||||
Mount: &csi03.VolumeCapability_MountVolume{
|
||||
FsType: "ext4",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
CapacityRange: &csi03.CapacityRange{
|
||||
RequiredBytes: 1024,
|
||||
},
|
||||
ControllerCreateSecrets: map[string]string{
|
||||
secretName: secretValue,
|
||||
"secret-xyz": "987",
|
||||
},
|
||||
}
|
||||
|
||||
// Current spec.
|
||||
createVolume := &csi.CreateVolumeRequest{
|
||||
AccessibilityRequirements: &csi.TopologyRequirement{
|
||||
Requisite: []*csi.Topology{
|
||||
&csi.Topology{
|
||||
Segments: map[string]string{
|
||||
"foo": "bar",
|
||||
"x": "y",
|
||||
},
|
||||
},
|
||||
&csi.Topology{
|
||||
Segments: map[string]string{
|
||||
"a": "b",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
Name: "foo",
|
||||
VolumeCapabilities: []*csi.VolumeCapability{
|
||||
&csi.VolumeCapability{
|
||||
AccessType: &csi.VolumeCapability_Mount{
|
||||
Mount: &csi.VolumeCapability_MountVolume{
|
||||
FsType: "ext4",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
CapacityRange: &csi.CapacityRange{
|
||||
RequiredBytes: 1024,
|
||||
},
|
||||
Secrets: map[string]string{
|
||||
secretName: secretValue,
|
||||
"secret-xyz": "987",
|
||||
},
|
||||
}
|
||||
|
||||
// Revised spec with more secret fields.
|
||||
createVolumeFuture := &csitest.CreateVolumeRequest{
|
||||
CapacityRange: &csitest.CapacityRange{
|
||||
RequiredBytes: 1024,
|
||||
},
|
||||
MaybeSecretMap: map[int64]*csitest.VolumeCapability{
|
||||
1: &csitest.VolumeCapability{ArraySecret: "aaa"},
|
||||
2: &csitest.VolumeCapability{ArraySecret: "bbb"},
|
||||
},
|
||||
Name: "foo",
|
||||
NewSecretInt: 42,
|
||||
Seecreets: map[string]string{
|
||||
secretName: secretValue,
|
||||
"secret-xyz": "987",
|
||||
},
|
||||
VolumeCapabilities: []*csitest.VolumeCapability{
|
||||
&csitest.VolumeCapability{
|
||||
AccessType: &csitest.VolumeCapability_Mount{
|
||||
Mount: &csitest.VolumeCapability_MountVolume{
|
||||
FsType: "ext4",
|
||||
},
|
||||
},
|
||||
ArraySecret: "knock knock",
|
||||
},
|
||||
&csitest.VolumeCapability{
|
||||
ArraySecret: "Who's there?",
|
||||
},
|
||||
},
|
||||
VolumeContentSource: &csitest.VolumeContentSource{
|
||||
Type: &csitest.VolumeContentSource_Volume{
|
||||
Volume: &csitest.VolumeContentSource_VolumeSource{
|
||||
VolumeId: "abc",
|
||||
OneofSecretField: "hello",
|
||||
},
|
||||
},
|
||||
NestedSecretField: "world",
|
||||
},
|
||||
}
|
||||
|
||||
type testcase struct {
|
||||
original, stripped interface{}
|
||||
}
|
||||
|
||||
cases := []testcase{
|
||||
{nil, "null"},
|
||||
{1, "1"},
|
||||
{"hello world", `"hello world"`},
|
||||
{true, "true"},
|
||||
{false, "false"},
|
||||
{&csi.CreateVolumeRequest{}, `{}`},
|
||||
// Test case from https://github.com/kubernetes-csi/csi-lib-utils/pull/1#pullrequestreview-180126394.
|
||||
{&csi.CreateVolumeRequest{
|
||||
Name: "test-volume",
|
||||
CapacityRange: &csi.CapacityRange{
|
||||
RequiredBytes: int64(1024),
|
||||
LimitBytes: int64(1024),
|
||||
},
|
||||
VolumeCapabilities: []*csi.VolumeCapability{
|
||||
&csi.VolumeCapability{
|
||||
AccessType: &csi.VolumeCapability_Mount{
|
||||
Mount: &csi.VolumeCapability_MountVolume{
|
||||
FsType: "ext4",
|
||||
MountFlags: []string{"flag1", "flag2", "flag3"},
|
||||
},
|
||||
},
|
||||
AccessMode: &csi.VolumeCapability_AccessMode{
|
||||
Mode: csi.VolumeCapability_AccessMode_MULTI_NODE_MULTI_WRITER,
|
||||
},
|
||||
},
|
||||
},
|
||||
Secrets: map[string]string{"secret1": "secret1", "secret2": "secret2"},
|
||||
Parameters: map[string]string{"param1": "param1", "param2": "param2"},
|
||||
VolumeContentSource: &csi.VolumeContentSource{},
|
||||
AccessibilityRequirements: &csi.TopologyRequirement{},
|
||||
}, `{"accessibility_requirements":{},"capacity_range":{"limit_bytes":1024,"required_bytes":1024},"name":"test-volume","parameters":{"param1":"param1","param2":"param2"},"secrets":"***stripped***","volume_capabilities":[{"AccessType":{"Mount":{"fs_type":"ext4","mount_flags":["flag1","flag2","flag3"]}},"access_mode":{"mode":5}}],"volume_content_source":{"Type":null}}`},
|
||||
{createVolume, `{"accessibility_requirements":{"requisite":[{"segments":{"foo":"bar","x":"y"}},{"segments":{"a":"b"}}]},"capacity_range":{"required_bytes":1024},"name":"foo","secrets":"***stripped***","volume_capabilities":[{"AccessType":{"Mount":{"fs_type":"ext4"}}}]}`},
|
||||
{createVolumeCSI03, `{"accessibility_requirements":{"requisite":[{"segments":{"foo":"bar","x":"y"}},{"segments":{"a":"b"}}]},"capacity_range":{"required_bytes":1024},"controller_create_secrets":"***stripped***","name":"foo","volume_capabilities":[{"AccessType":{"Mount":{"fs_type":"ext4"}}}]}`},
|
||||
{&csitest.CreateVolumeRequest{}, `{}`},
|
||||
{createVolumeFuture,
|
||||
// Secrets are *not* removed from all fields yet. This will have to be fixed one way or another
|
||||
// before the CSI spec can start using secrets there (currently it doesn't).
|
||||
// The test is still useful because it shows that also complicated fields get serialized.
|
||||
// `{"capacity_range":{"required_bytes":1024},"maybe_secret_map":{"1":{"AccessType":null,"array_secret":"***stripped***"},"2":{"AccessType":null,"array_secret":"***stripped***"}},"name":"foo","new_secret_int":"***stripped***","seecreets":"***stripped***","volume_capabilities":[{"AccessType":{"Mount":{"fs_type":"ext4"}},"array_secret":"***stripped***"},{"AccessType":null,"array_secret":"***stripped***"}],"volume_content_source":{"Type":{"Volume":{"oneof_secret_field":"***stripped***","volume_id":"abc"}},"nested_secret_field":"***stripped***"}}`,
|
||||
`{"capacity_range":{"required_bytes":1024},"maybe_secret_map":{"1":{"AccessType":null,"array_secret":"aaa"},"2":{"AccessType":null,"array_secret":"bbb"}},"name":"foo","new_secret_int":"***stripped***","seecreets":"***stripped***","volume_capabilities":[{"AccessType":{"Mount":{"fs_type":"ext4"}},"array_secret":"***stripped***"},{"AccessType":null,"array_secret":"***stripped***"}],"volume_content_source":{"Type":{"Volume":{"oneof_secret_field":"hello","volume_id":"abc"}},"nested_secret_field":"***stripped***"}}`,
|
||||
},
|
||||
}
|
||||
|
||||
// Message from revised spec as received by a sidecar based on the current spec.
|
||||
// The XXX_unrecognized field contains secrets and must not get logged.
|
||||
unknownFields := &csi.CreateVolumeRequest{}
|
||||
data, err := proto.Marshal(createVolumeFuture)
|
||||
if assert.NoError(t, err, "marshall future message") &&
|
||||
assert.NoError(t, proto.Unmarshal(data, unknownFields), "unmarshal with unknown fields") {
|
||||
cases = append(cases, testcase{unknownFields,
|
||||
`{"capacity_range":{"required_bytes":1024},"name":"foo","secrets":"***stripped***","volume_capabilities":[{"AccessType":{"Mount":{"fs_type":"ext4"}}},{"AccessType":null}],"volume_content_source":{"Type":{"Volume":{"volume_id":"abc"}}}}`,
|
||||
})
|
||||
}
|
||||
|
||||
for _, c := range cases {
|
||||
before := fmt.Sprint(c.original)
|
||||
var stripped fmt.Stringer
|
||||
if _, ok := c.original.(*csi03.CreateVolumeRequest); ok {
|
||||
stripped = StripSecretsCSI03(c.original)
|
||||
} else {
|
||||
stripped = StripSecrets(c.original)
|
||||
}
|
||||
if assert.Equal(t, c.stripped, fmt.Sprintf("%s", stripped), "unexpected result for fmt s of %s", c.original) {
|
||||
if assert.Equal(t, c.stripped, fmt.Sprintf("%v", stripped), "unexpected result for fmt v of %s", c.original) {
|
||||
assert.Equal(t, c.stripped, fmt.Sprintf("%+v", stripped), "unexpected result for fmt +v of %s", c.original)
|
||||
}
|
||||
}
|
||||
assert.Equal(t, before, fmt.Sprint(c.original), "original value modified")
|
||||
}
|
||||
|
||||
// The secret is hidden because StripSecrets is a struct referencing it.
|
||||
dump := fmt.Sprintf("%#v", StripSecrets(createVolume))
|
||||
assert.NotContains(t, dump, secretName)
|
||||
assert.NotContains(t, dump, secretValue)
|
||||
}
|
5
vendor/github.com/kubernetes-csi/csi-lib-utils/protosanitizer/test/.gitignore
generated
vendored
5
vendor/github.com/kubernetes-csi/csi-lib-utils/protosanitizer/test/.gitignore
generated
vendored
@ -1,5 +0,0 @@
|
||||
/protoc
|
||||
/protoc-gen-go
|
||||
/csi.a
|
||||
/.protoc
|
||||
.build
|
136
vendor/github.com/kubernetes-csi/csi-lib-utils/protosanitizer/test/Makefile
generated
vendored
136
vendor/github.com/kubernetes-csi/csi-lib-utils/protosanitizer/test/Makefile
generated
vendored
@ -1,136 +0,0 @@
|
||||
all: build
|
||||
|
||||
########################################################################
|
||||
## GOLANG ##
|
||||
########################################################################
|
||||
|
||||
# If GOPATH isn't defined then set its default location.
|
||||
ifeq (,$(strip $(GOPATH)))
|
||||
GOPATH := $(HOME)/go
|
||||
else
|
||||
# If GOPATH is already set then update GOPATH to be its own
|
||||
# first element.
|
||||
GOPATH := $(word 1,$(subst :, ,$(GOPATH)))
|
||||
endif
|
||||
export GOPATH
|
||||
|
||||
|
||||
########################################################################
|
||||
## PROTOC ##
|
||||
########################################################################
|
||||
|
||||
# Only set PROTOC_VER if it has an empty value.
|
||||
ifeq (,$(strip $(PROTOC_VER)))
|
||||
PROTOC_VER := 3.5.1
|
||||
endif
|
||||
|
||||
PROTOC_OS := $(shell uname -s)
|
||||
ifeq (Darwin,$(PROTOC_OS))
|
||||
PROTOC_OS := osx
|
||||
endif
|
||||
|
||||
PROTOC_ARCH := $(shell uname -m)
|
||||
ifeq (i386,$(PROTOC_ARCH))
|
||||
PROTOC_ARCH := x86_32
|
||||
endif
|
||||
|
||||
PROTOC := ./protoc
|
||||
PROTOC_ZIP := protoc-$(PROTOC_VER)-$(PROTOC_OS)-$(PROTOC_ARCH).zip
|
||||
PROTOC_URL := https://github.com/google/protobuf/releases/download/v$(PROTOC_VER)/$(PROTOC_ZIP)
|
||||
PROTOC_TMP_DIR := .protoc
|
||||
PROTOC_TMP_BIN := $(PROTOC_TMP_DIR)/bin/protoc
|
||||
|
||||
$(PROTOC):
|
||||
-mkdir -p "$(PROTOC_TMP_DIR)" && \
|
||||
curl -L $(PROTOC_URL) -o "$(PROTOC_TMP_DIR)/$(PROTOC_ZIP)" && \
|
||||
unzip "$(PROTOC_TMP_DIR)/$(PROTOC_ZIP)" -d "$(PROTOC_TMP_DIR)" && \
|
||||
chmod 0755 "$(PROTOC_TMP_BIN)" && \
|
||||
cp -f "$(PROTOC_TMP_BIN)" "$@"
|
||||
stat "$@" > /dev/null 2>&1
|
||||
|
||||
|
||||
########################################################################
|
||||
## PROTOC-GEN-GO ##
|
||||
########################################################################
|
||||
|
||||
# This is the recipe for getting and installing the go plug-in
|
||||
# for protoc
|
||||
PROTOC_GEN_GO_PKG := github.com/golang/protobuf/protoc-gen-go
|
||||
PROTOC_GEN_GO := protoc-gen-go
|
||||
$(PROTOC_GEN_GO): PROTOBUF_PKG := $(dir $(PROTOC_GEN_GO_PKG))
|
||||
$(PROTOC_GEN_GO): PROTOBUF_VERSION := v1.2.0
|
||||
$(PROTOC_GEN_GO):
|
||||
mkdir -p $(dir $(GOPATH)/src/$(PROTOBUF_PKG))
|
||||
test -d $(GOPATH)/src/$(PROTOBUF_PKG)/.git || git clone https://$(PROTOBUF_PKG) $(GOPATH)/src/$(PROTOBUF_PKG)
|
||||
(cd $(GOPATH)/src/$(PROTOBUF_PKG) && \
|
||||
(test "$$(git describe --tags | head -1)" = "$(PROTOBUF_VERSION)" || \
|
||||
(git fetch && git checkout tags/$(PROTOBUF_VERSION))))
|
||||
(cd $(GOPATH)/src/$(PROTOBUF_PKG) && go get -v -d $$(go list -f '{{ .ImportPath }}' ./...)) && \
|
||||
go build -o "$@" $(PROTOC_GEN_GO_PKG)
|
||||
|
||||
|
||||
########################################################################
|
||||
## PATH ##
|
||||
########################################################################
|
||||
|
||||
# Update PATH with the current directory. This enables the protoc
|
||||
# binary to discover the protoc-gen-go binary, built inside this
|
||||
# directory.
|
||||
export PATH := $(shell pwd):$(PATH)
|
||||
|
||||
|
||||
########################################################################
|
||||
## BUILD ##
|
||||
########################################################################
|
||||
CSI_PROTO := ./csitest.proto
|
||||
CSI_PKG_ROOT := github.com/kubernetes-csi/csi-lib-utils/protosanitizer/test
|
||||
CSI_PKG_SUB := $(shell cat $(CSI_PROTO) | sed -n -e 's/^package.\([^;]*\).v[0-9]\+;$$/\1/p'|tr '.' '/')
|
||||
CSI_BUILD := $(CSI_PKG_SUB)/.build
|
||||
CSI_GO := $(CSI_PKG_SUB)/csitest.pb.go
|
||||
CSI_A := csi.a
|
||||
CSI_GO_TMP := $(CSI_BUILD)/$(CSI_PKG_ROOT)/csitest.pb.go
|
||||
|
||||
# This recipe generates the go language bindings to a temp area.
|
||||
$(CSI_GO_TMP): HERE := $(shell pwd)
|
||||
$(CSI_GO_TMP): PTYPES_PKG := github.com/golang/protobuf/ptypes
|
||||
$(CSI_GO_TMP): GO_OUT := plugins=grpc
|
||||
$(CSI_GO_TMP): GO_OUT := $(GO_OUT),Mgoogle/protobuf/descriptor.proto=github.com/golang/protobuf/protoc-gen-go/descriptor
|
||||
$(CSI_GO_TMP): GO_OUT := $(GO_OUT),Mgoogle/protobuf/wrappers.proto=$(PTYPES_PKG)/wrappers
|
||||
$(CSI_GO_TMP): GO_OUT := $(GO_OUT):"$(HERE)/$(CSI_BUILD)"
|
||||
$(CSI_GO_TMP): INCLUDE := -I$(GOPATH)/src -I$(HERE)/$(PROTOC_TMP_DIR)/include
|
||||
$(CSI_GO_TMP): $(CSI_PROTO) | $(PROTOC) $(PROTOC_GEN_GO)
|
||||
@mkdir -p "$(@D)"
|
||||
(cd "$(GOPATH)/src" && \
|
||||
$(HERE)/$(PROTOC) $(INCLUDE) --go_out=$(GO_OUT) "$(CSI_PKG_ROOT)/$(<F)")
|
||||
|
||||
# The temp language bindings are compared to the ones that are
|
||||
# versioned. If they are different then it means the language
|
||||
# bindings were not updated prior to being committed.
|
||||
$(CSI_GO): $(CSI_GO_TMP)
|
||||
ifeq (true,$(TRAVIS))
|
||||
diff "$@" "$?"
|
||||
else
|
||||
@mkdir -p "$(@D)"
|
||||
diff "$@" "$?" > /dev/null 2>&1 || cp -f "$?" "$@"
|
||||
endif
|
||||
|
||||
# This recipe builds the Go archive from the sources in three steps:
|
||||
#
|
||||
# 1. Go get any missing dependencies.
|
||||
# 2. Cache the packages.
|
||||
# 3. Build the archive file.
|
||||
$(CSI_A): $(CSI_GO)
|
||||
go get -v -d ./...
|
||||
go install ./$(CSI_PKG_SUB)
|
||||
go build -o "$@" ./$(CSI_PKG_SUB)
|
||||
|
||||
build: $(CSI_A)
|
||||
|
||||
clean:
|
||||
go clean -i ./...
|
||||
rm -rf "$(CSI_A)" "$(CSI_GO)" "$(CSI_BUILD)"
|
||||
|
||||
clobber: clean
|
||||
rm -fr "$(PROTOC)" "$(PROTOC_GEN_GO)" "$(CSI_PKG_SUB)" "$(PROTOC_TMP_DIR)"
|
||||
|
||||
.PHONY: clean clobber
|
2
vendor/github.com/kubernetes-csi/csi-lib-utils/protosanitizer/test/README.md
generated
vendored
2
vendor/github.com/kubernetes-csi/csi-lib-utils/protosanitizer/test/README.md
generated
vendored
@ -1,2 +0,0 @@
|
||||
This is a *modified* version of the CSI 1.0.0 spec. It's only purpose is
|
||||
to test the stripping of secret fields.
|
1203
vendor/github.com/kubernetes-csi/csi-lib-utils/protosanitizer/test/csi.proto
generated
vendored
1203
vendor/github.com/kubernetes-csi/csi-lib-utils/protosanitizer/test/csi.proto
generated
vendored
File diff suppressed because it is too large
Load Diff
4991
vendor/github.com/kubernetes-csi/csi-lib-utils/protosanitizer/test/csi03/csi.pb.go
generated
vendored
4991
vendor/github.com/kubernetes-csi/csi-lib-utils/protosanitizer/test/csi03/csi.pb.go
generated
vendored
File diff suppressed because it is too large
Load Diff
5277
vendor/github.com/kubernetes-csi/csi-lib-utils/protosanitizer/test/csi10/csi.pb.go
generated
vendored
5277
vendor/github.com/kubernetes-csi/csi-lib-utils/protosanitizer/test/csi10/csi.pb.go
generated
vendored
File diff suppressed because it is too large
Load Diff
1217
vendor/github.com/kubernetes-csi/csi-lib-utils/protosanitizer/test/csitest.proto
generated
vendored
1217
vendor/github.com/kubernetes-csi/csi-lib-utils/protosanitizer/test/csitest.proto
generated
vendored
File diff suppressed because it is too large
Load Diff
5326
vendor/github.com/kubernetes-csi/csi-lib-utils/protosanitizer/test/csitest/csitest.pb.go
generated
vendored
5326
vendor/github.com/kubernetes-csi/csi-lib-utils/protosanitizer/test/csitest/csitest.pb.go
generated
vendored
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user