Compare commits

..

10 Commits

Author SHA1 Message Date
gadotroee
2c1aa9022b Add option to specify k8s context (#878)
Co-authored-by: M. Mert Yildiran <mehmet@up9.com>
2022-03-05 19:15:33 +02:00
RoyUP9
5af0c5a9e9 Refactor to acceptance tests setup (#875) 2022-03-03 17:22:26 +02:00
RoyUP9
8217ac3ed0 Switched echo to return json (#874) 2022-03-03 12:23:09 +02:00
M. Mert Yıldıran
de769131de Upgrade Basenine version to v0.5.4 (#873) 2022-03-02 22:34:06 +03:00
RoyUP9
5f8a5a3a29 Exported test funcs (#872) 2022-03-02 18:34:51 +02:00
Igor Gov
7f4cb6dfd4 Remove deploy folder (#871) 2022-03-02 15:58:50 +02:00
M. Mert Yıldıran
3b063c3bb5 Add the ability to set the insertion filter into CLI (#843)
* Add the ability to set the insertion filter into CLI

* Resolve the conflict

* Upgrade Basenine to `v0.5.0` and check the insertion filter against syntax errors inside CLI

* Upgrade Basenine to `v0.5.1`

* Update the sums
2022-03-02 12:51:32 +03:00
RoyUP9
b9f5475e3a Exported test consts (#870) 2022-03-02 10:02:21 +02:00
RamiBerm
346e904e77 Support stopping oas/servicemesh/telemetry in flight (#869)
* Update oas_generator.go and servicemap.go

* Update oas_generator.go

* Update esClient.go

* Update servicemap.go
2022-03-02 09:49:17 +02:00
Nimrod Gilboa Markevich
c5471c501b Add acceptance tests for k8s permissions (#834) 2022-03-01 12:22:34 +02:00
44 changed files with 406 additions and 445 deletions

View File

@@ -22,7 +22,17 @@ jobs:
uses: actions/checkout@v2 uses: actions/checkout@v2
- name: Setup acceptance test - name: Setup acceptance test
run: source ./acceptanceTests/setup.sh run: ./acceptanceTests/setup.sh
- name: Create k8s users and change context
env:
USERNAME_UNRESTRICTED: user-with-clusterwide-access
USERNAME_RESTRICTED: user-with-restricted-access
run: |
./acceptanceTests/create_user.sh "${USERNAME_UNRESTRICTED}"
./acceptanceTests/create_user.sh "${USERNAME_RESTRICTED}"
kubectl apply -f cli/cmd/permissionFiles/permissions-all-namespaces-tap.yaml
kubectl config use-context ${USERNAME_UNRESTRICTED}
- name: Test - name: Test
run: make acceptance-test run: make acceptance-test

2
.gitignore vendored
View File

@@ -30,7 +30,7 @@ build
pprof/* pprof/*
# Database Files # Database Files
*.bin *.db
*.gob *.gob
# Nohup Files - https://man7.org/linux/man-pages/man1/nohup.1p.html # Nohup Files - https://man7.org/linux/man-pages/man1/nohup.1p.html

View File

@@ -78,8 +78,8 @@ RUN go build -ldflags="-extldflags=-static -s -w \
-X 'github.com/up9inc/mizu/agent/pkg/version.Ver=${VER}'" -o mizuagent . -X 'github.com/up9inc/mizu/agent/pkg/version.Ver=${VER}'" -o mizuagent .
# Download Basenine executable, verify the sha1sum # Download Basenine executable, verify the sha1sum
ADD https://github.com/up9inc/basenine/releases/download/v0.4.17/basenine_linux_${GOARCH} ./basenine_linux_${GOARCH} ADD https://github.com/up9inc/basenine/releases/download/v0.5.4/basenine_linux_${GOARCH} ./basenine_linux_${GOARCH}
ADD https://github.com/up9inc/basenine/releases/download/v0.4.17/basenine_linux_${GOARCH}.sha256 ./basenine_linux_${GOARCH}.sha256 ADD https://github.com/up9inc/basenine/releases/download/v0.5.4/basenine_linux_${GOARCH}.sha256 ./basenine_linux_${GOARCH}.sha256
RUN shasum -a 256 -c basenine_linux_${GOARCH}.sha256 RUN shasum -a 256 -c basenine_linux_${GOARCH}.sha256
RUN chmod +x ./basenine_linux_${GOARCH} RUN chmod +x ./basenine_linux_${GOARCH}
RUN mv ./basenine_linux_${GOARCH} ./basenine RUN mv ./basenine_linux_${GOARCH} ./basenine

View File

@@ -31,9 +31,6 @@ cli: ## Build CLI.
cli-debug: ## Build CLI. cli-debug: ## Build CLI.
@echo "building cli"; cd cli && $(MAKE) build-debug @echo "building cli"; cd cli && $(MAKE) build-debug
build-cli-ci: ## Build CLI for CI.
@echo "building cli for ci"; cd cli && $(MAKE) build GIT_BRANCH=ci SUFFIX=ci
agent: ## Build agent. agent: ## Build agent.
@(echo "building mizu agent .." ) @(echo "building mizu agent .." )
@(cd agent; go build -o build/mizuagent main.go) @(cd agent; go build -o build/mizuagent main.go)
@@ -57,10 +54,6 @@ push-docker: ## Build and publish agent docker image.
@echo "publishing Docker image .. " @echo "publishing Docker image .. "
devops/build-push-featurebranch.sh devops/build-push-featurebranch.sh
build-docker-ci: ## Build agent docker image for CI.
@echo "building docker image for ci"
devops/build-agent-ci.sh
push-cli: ## Build and publish CLI. push-cli: ## Build and publish CLI.
@echo "publishing CLI .. " @echo "publishing CLI .. "
@cd cli; $(MAKE) build-all @cd cli; $(MAKE) build-all

37
acceptanceTests/create_user.sh Executable file
View File

@@ -0,0 +1,37 @@
#!/bin/bash
# Create a user in Minikube cluster "minikube"
# Create context for user
# Usage:
# ./create_user.sh <username>
set -e
NEW_USERNAME=$1
CERT_DIR="${HOME}/certs"
KEY_FILE="${CERT_DIR}/${NEW_USERNAME}.key"
CRT_FILE="${CERT_DIR}/${NEW_USERNAME}.crt"
MINIKUBE_KEY_FILE="${HOME}/.minikube/ca.key"
MINIKUBE_CRT_FILE="${HOME}/.minikube/ca.crt"
DAYS=1
echo "Creating user and context for username \"${NEW_USERNAME}\" in Minikube cluster"
if ! command -v openssl &> /dev/null
then
echo "Installing openssl"
sudo apt-get update
sudo apt-get install openssl
fi
echo "Creating certificate for user \"${NEW_USERNAME}\""
mkdir -p ${CERT_DIR}
echo "Generating key \"${KEY_FILE}\""
openssl genrsa -out "${KEY_FILE}" 2048
echo "Generating crt \"${CRT_FILE}\""
openssl req -new -key "${KEY_FILE}" -out "${CRT_FILE}" -subj "/CN=${NEW_USERNAME}/O=group1"
openssl x509 -req -in "${CRT_FILE}" -CA "${MINIKUBE_CRT_FILE}" -CAkey "${MINIKUBE_KEY_FILE}" -CAcreateserial -out "${CRT_FILE}" -days $DAYS
echo "Creating context for user \"${NEW_USERNAME}\""
kubectl config set-credentials "${NEW_USERNAME}" --client-certificate="${CRT_FILE}" --client-key="${KEY_FILE}"
kubectl config set-context "${NEW_USERNAME}" --cluster=minikube --user="${NEW_USERNAME}"

View File

@@ -40,7 +40,7 @@ func TestRedis(t *testing.T) {
return return
} }
apiServerUrl := GetApiServerUrl(defaultApiServerPort) apiServerUrl := GetApiServerUrl(DefaultApiServerPort)
if err := WaitTapPodsReady(apiServerUrl); err != nil { if err := WaitTapPodsReady(apiServerUrl); err != nil {
t.Errorf("failed to start tap pods on time, err: %v", err) t.Errorf("failed to start tap pods on time, err: %v", err)
@@ -49,7 +49,13 @@ func TestRedis(t *testing.T) {
ctx := context.Background() ctx := context.Background()
redisExternalIp, err := GetServiceExternalIp(ctx, defaultNamespaceName, "redis") kubernetesProvider, err := NewKubernetesProvider()
if err != nil {
t.Errorf("failed to create k8s provider, err %v", err)
return
}
redisExternalIp, err := kubernetesProvider.GetServiceExternalIp(ctx, DefaultNamespaceName, "redis")
if err != nil { if err != nil {
t.Errorf("failed to get redis external ip, err: %v", err) t.Errorf("failed to get redis external ip, err: %v", err)
return return
@@ -59,7 +65,7 @@ func TestRedis(t *testing.T) {
Addr: fmt.Sprintf("%v:6379", redisExternalIp), Addr: fmt.Sprintf("%v:6379", redisExternalIp),
}) })
for i := 0; i < defaultEntriesCount/5; i++ { for i := 0; i < DefaultEntriesCount/5; i++ {
requestErr := rdb.Ping(ctx).Err() requestErr := rdb.Ping(ctx).Err()
if requestErr != nil { if requestErr != nil {
t.Errorf("failed to send redis request, err: %v", requestErr) t.Errorf("failed to send redis request, err: %v", requestErr)
@@ -67,7 +73,7 @@ func TestRedis(t *testing.T) {
} }
} }
for i := 0; i < defaultEntriesCount/5; i++ { for i := 0; i < DefaultEntriesCount/5; i++ {
requestErr := rdb.Set(ctx, "key", "value", -1).Err() requestErr := rdb.Set(ctx, "key", "value", -1).Err()
if requestErr != nil { if requestErr != nil {
t.Errorf("failed to send redis request, err: %v", requestErr) t.Errorf("failed to send redis request, err: %v", requestErr)
@@ -75,7 +81,7 @@ func TestRedis(t *testing.T) {
} }
} }
for i := 0; i < defaultEntriesCount/5; i++ { for i := 0; i < DefaultEntriesCount/5; i++ {
requestErr := rdb.Exists(ctx, "key").Err() requestErr := rdb.Exists(ctx, "key").Err()
if requestErr != nil { if requestErr != nil {
t.Errorf("failed to send redis request, err: %v", requestErr) t.Errorf("failed to send redis request, err: %v", requestErr)
@@ -83,7 +89,7 @@ func TestRedis(t *testing.T) {
} }
} }
for i := 0; i < defaultEntriesCount/5; i++ { for i := 0; i < DefaultEntriesCount/5; i++ {
requestErr := rdb.Get(ctx, "key").Err() requestErr := rdb.Get(ctx, "key").Err()
if requestErr != nil { if requestErr != nil {
t.Errorf("failed to send redis request, err: %v", requestErr) t.Errorf("failed to send redis request, err: %v", requestErr)
@@ -91,7 +97,7 @@ func TestRedis(t *testing.T) {
} }
} }
for i := 0; i < defaultEntriesCount/5; i++ { for i := 0; i < DefaultEntriesCount/5; i++ {
requestErr := rdb.Del(ctx, "key").Err() requestErr := rdb.Del(ctx, "key").Err()
if requestErr != nil { if requestErr != nil {
t.Errorf("failed to send redis request, err: %v", requestErr) t.Errorf("failed to send redis request, err: %v", requestErr)
@@ -132,7 +138,7 @@ func TestAmqp(t *testing.T) {
return return
} }
apiServerUrl := GetApiServerUrl(defaultApiServerPort) apiServerUrl := GetApiServerUrl(DefaultApiServerPort)
if err := WaitTapPodsReady(apiServerUrl); err != nil { if err := WaitTapPodsReady(apiServerUrl); err != nil {
t.Errorf("failed to start tap pods on time, err: %v", err) t.Errorf("failed to start tap pods on time, err: %v", err)
@@ -141,7 +147,13 @@ func TestAmqp(t *testing.T) {
ctx := context.Background() ctx := context.Background()
rabbitmqExternalIp, err := GetServiceExternalIp(ctx, defaultNamespaceName, "rabbitmq") kubernetesProvider, err := NewKubernetesProvider()
if err != nil {
t.Errorf("failed to create k8s provider, err %v", err)
return
}
rabbitmqExternalIp, err := kubernetesProvider.GetServiceExternalIp(ctx, DefaultNamespaceName, "rabbitmq")
if err != nil { if err != nil {
t.Errorf("failed to get RabbitMQ external ip, err: %v", err) t.Errorf("failed to get RabbitMQ external ip, err: %v", err)
return return
@@ -157,7 +169,7 @@ func TestAmqp(t *testing.T) {
// Temporary fix for missing amqp entries // Temporary fix for missing amqp entries
time.Sleep(10 * time.Second) time.Sleep(10 * time.Second)
for i := 0; i < defaultEntriesCount/5; i++ { for i := 0; i < DefaultEntriesCount/5; i++ {
ch, err := conn.Channel() ch, err := conn.Channel()
if err != nil { if err != nil {
t.Errorf("failed to open a channel, err: %v", err) t.Errorf("failed to open a channel, err: %v", err)

View File

@@ -36,7 +36,7 @@ func TestLogs(t *testing.T) {
return return
} }
apiServerUrl := GetApiServerUrl(defaultApiServerPort) apiServerUrl := GetApiServerUrl(DefaultApiServerPort)
if err := WaitTapPodsReady(apiServerUrl); err != nil { if err := WaitTapPodsReady(apiServerUrl); err != nil {
t.Errorf("failed to start tap pods on time, err: %v", err) t.Errorf("failed to start tap pods on time, err: %v", err)
@@ -137,7 +137,7 @@ func TestLogsPath(t *testing.T) {
return return
} }
apiServerUrl := GetApiServerUrl(defaultApiServerPort) apiServerUrl := GetApiServerUrl(DefaultApiServerPort)
if err := WaitTapPodsReady(apiServerUrl); err != nil { if err := WaitTapPodsReady(apiServerUrl); err != nil {
t.Errorf("failed to start tap pods on time, err: %v", err) t.Errorf("failed to start tap pods on time, err: %v", err)

10
acceptanceTests/setup.sh Normal file → Executable file
View File

@@ -57,14 +57,14 @@ kubectl expose deployment rabbitmq --type=LoadBalancer --port=5672 -n mizu-tests
echo "Starting proxy" echo "Starting proxy"
kubectl proxy --port=8080 & kubectl proxy --port=8080 &
echo "Starting tunnel"
minikube tunnel &
echo "Setting minikube docker env" echo "Setting minikube docker env"
eval $(minikube docker-env) eval $(minikube docker-env)
echo "Build agent image" echo "Build agent image"
make build-docker-ci docker build -t mizu/ci:0.0 .
echo "Build cli" echo "Build cli"
make build-cli-ci cd cli && make build GIT_BRANCH=ci SUFFIX=ci
echo "Starting tunnel"
minikube tunnel &

View File

@@ -14,6 +14,10 @@ import (
) )
func TestTap(t *testing.T) { func TestTap(t *testing.T) {
basicTapTest(t, false)
}
func basicTapTest(t *testing.T, shouldCheckSrcAndDest bool, extraArgs... string) {
if testing.Short() { if testing.Short() {
t.Skip("ignored acceptance test") t.Skip("ignored acceptance test")
} }
@@ -33,6 +37,8 @@ func TestTap(t *testing.T) {
tapNamespace := GetDefaultTapNamespace() tapNamespace := GetDefaultTapNamespace()
tapCmdArgs = append(tapCmdArgs, tapNamespace...) tapCmdArgs = append(tapCmdArgs, tapNamespace...)
tapCmdArgs = append(tapCmdArgs, extraArgs...)
tapCmd := exec.Command(cliPath, tapCmdArgs...) tapCmd := exec.Command(cliPath, tapCmdArgs...)
t.Logf("running command: %v", tapCmd.String()) t.Logf("running command: %v", tapCmd.String())
@@ -47,14 +53,14 @@ func TestTap(t *testing.T) {
return return
} }
apiServerUrl := GetApiServerUrl(defaultApiServerPort) apiServerUrl := GetApiServerUrl(DefaultApiServerPort)
if err := WaitTapPodsReady(apiServerUrl); err != nil { if err := WaitTapPodsReady(apiServerUrl); err != nil {
t.Errorf("failed to start tap pods on time, err: %v", err) t.Errorf("failed to start tap pods on time, err: %v", err)
return return
} }
proxyUrl := GetProxyUrl(defaultNamespaceName, defaultServiceName) proxyUrl := GetProxyUrl(DefaultNamespaceName, DefaultServiceName)
for i := 0; i < entriesCount; i++ { for i := 0; i < entriesCount; i++ {
if _, requestErr := ExecuteHttpGetRequest(fmt.Sprintf("%v/get", proxyUrl)); requestErr != nil { if _, requestErr := ExecuteHttpGetRequest(fmt.Sprintf("%v/get", proxyUrl)); requestErr != nil {
t.Errorf("failed to send proxy request, err: %v", requestErr) t.Errorf("failed to send proxy request, err: %v", requestErr)
@@ -72,7 +78,6 @@ func TestTap(t *testing.T) {
expectedPodsStr += fmt.Sprintf("Name:%vNamespace:%v", expectedPods[i].Name, expectedPods[i].Namespace) expectedPodsStr += fmt.Sprintf("Name:%vNamespace:%v", expectedPods[i].Name, expectedPods[i].Namespace)
} }
const shouldCheckSrcAndDest = false
RunCypressTests(t, fmt.Sprintf("npx cypress run --spec \"cypress/integration/tests/UiTest.js\" --env entriesCount=%d,arrayDict=%v,shouldCheckSrcAndDest=%v", RunCypressTests(t, fmt.Sprintf("npx cypress run --spec \"cypress/integration/tests/UiTest.js\" --env entriesCount=%d,arrayDict=%v,shouldCheckSrcAndDest=%v",
entriesCount, expectedPodsStr, shouldCheckSrcAndDest)) entriesCount, expectedPodsStr, shouldCheckSrcAndDest))
}) })
@@ -122,8 +127,8 @@ func TestTapGuiPort(t *testing.T) {
return return
} }
proxyUrl := GetProxyUrl(defaultNamespaceName, defaultServiceName) proxyUrl := GetProxyUrl(DefaultNamespaceName, DefaultServiceName)
for i := 0; i < defaultEntriesCount; i++ { for i := 0; i < DefaultEntriesCount; i++ {
if _, requestErr := ExecuteHttpGetRequest(fmt.Sprintf("%v/get", proxyUrl)); requestErr != nil { if _, requestErr := ExecuteHttpGetRequest(fmt.Sprintf("%v/get", proxyUrl)); requestErr != nil {
t.Errorf("failed to send proxy request, err: %v", requestErr) t.Errorf("failed to send proxy request, err: %v", requestErr)
return return
@@ -170,7 +175,7 @@ func TestTapAllNamespaces(t *testing.T) {
return return
} }
apiServerUrl := GetApiServerUrl(defaultApiServerPort) apiServerUrl := GetApiServerUrl(DefaultApiServerPort)
if err := WaitTapPodsReady(apiServerUrl); err != nil { if err := WaitTapPodsReady(apiServerUrl); err != nil {
t.Errorf("failed to start tap pods on time, err: %v", err) t.Errorf("failed to start tap pods on time, err: %v", err)
@@ -219,7 +224,7 @@ func TestTapMultipleNamespaces(t *testing.T) {
return return
} }
apiServerUrl := GetApiServerUrl(defaultApiServerPort) apiServerUrl := GetApiServerUrl(DefaultApiServerPort)
if err := WaitTapPodsReady(apiServerUrl); err != nil { if err := WaitTapPodsReady(apiServerUrl); err != nil {
t.Errorf("failed to start tap pods on time, err: %v", err) t.Errorf("failed to start tap pods on time, err: %v", err)
@@ -265,7 +270,7 @@ func TestTapRegex(t *testing.T) {
return return
} }
apiServerUrl := GetApiServerUrl(defaultApiServerPort) apiServerUrl := GetApiServerUrl(DefaultApiServerPort)
if err := WaitTapPodsReady(apiServerUrl); err != nil { if err := WaitTapPodsReady(apiServerUrl); err != nil {
t.Errorf("failed to start tap pods on time, err: %v", err) t.Errorf("failed to start tap pods on time, err: %v", err)
@@ -313,7 +318,7 @@ func TestTapDryRun(t *testing.T) {
}() }()
go func() { go func() {
time.Sleep(shortRetriesCount * time.Second) time.Sleep(ShortRetriesCount * time.Second)
resultChannel <- "fail" resultChannel <- "fail"
}() }()
@@ -353,17 +358,17 @@ func TestTapRedact(t *testing.T) {
return return
} }
apiServerUrl := GetApiServerUrl(defaultApiServerPort) apiServerUrl := GetApiServerUrl(DefaultApiServerPort)
if err := WaitTapPodsReady(apiServerUrl); err != nil { if err := WaitTapPodsReady(apiServerUrl); err != nil {
t.Errorf("failed to start tap pods on time, err: %v", err) t.Errorf("failed to start tap pods on time, err: %v", err)
return return
} }
proxyUrl := GetProxyUrl(defaultNamespaceName, defaultServiceName) proxyUrl := GetProxyUrl(DefaultNamespaceName, DefaultServiceName)
requestHeaders := map[string]string{"User-Header": "Mizu"} requestHeaders := map[string]string{"User-Header": "Mizu"}
requestBody := map[string]string{"User": "Mizu"} requestBody := map[string]string{"User": "Mizu"}
for i := 0; i < defaultEntriesCount; i++ { for i := 0; i < DefaultEntriesCount; i++ {
if _, requestErr := ExecuteHttpPostRequestWithHeaders(fmt.Sprintf("%v/post", proxyUrl), requestHeaders, requestBody); requestErr != nil { if _, requestErr := ExecuteHttpPostRequestWithHeaders(fmt.Sprintf("%v/post", proxyUrl), requestHeaders, requestBody); requestErr != nil {
t.Errorf("failed to send proxy request, err: %v", requestErr) t.Errorf("failed to send proxy request, err: %v", requestErr)
return return
@@ -405,17 +410,17 @@ func TestTapNoRedact(t *testing.T) {
return return
} }
apiServerUrl := GetApiServerUrl(defaultApiServerPort) apiServerUrl := GetApiServerUrl(DefaultApiServerPort)
if err := WaitTapPodsReady(apiServerUrl); err != nil { if err := WaitTapPodsReady(apiServerUrl); err != nil {
t.Errorf("failed to start tap pods on time, err: %v", err) t.Errorf("failed to start tap pods on time, err: %v", err)
return return
} }
proxyUrl := GetProxyUrl(defaultNamespaceName, defaultServiceName) proxyUrl := GetProxyUrl(DefaultNamespaceName, DefaultServiceName)
requestHeaders := map[string]string{"User-Header": "Mizu"} requestHeaders := map[string]string{"User-Header": "Mizu"}
requestBody := map[string]string{"User": "Mizu"} requestBody := map[string]string{"User": "Mizu"}
for i := 0; i < defaultEntriesCount; i++ { for i := 0; i < DefaultEntriesCount; i++ {
if _, requestErr := ExecuteHttpPostRequestWithHeaders(fmt.Sprintf("%v/post", proxyUrl), requestHeaders, requestBody); requestErr != nil { if _, requestErr := ExecuteHttpPostRequestWithHeaders(fmt.Sprintf("%v/post", proxyUrl), requestHeaders, requestBody); requestErr != nil {
t.Errorf("failed to send proxy request, err: %v", requestErr) t.Errorf("failed to send proxy request, err: %v", requestErr)
return return
@@ -457,15 +462,15 @@ func TestTapRegexMasking(t *testing.T) {
return return
} }
apiServerUrl := GetApiServerUrl(defaultApiServerPort) apiServerUrl := GetApiServerUrl(DefaultApiServerPort)
if err := WaitTapPodsReady(apiServerUrl); err != nil { if err := WaitTapPodsReady(apiServerUrl); err != nil {
t.Errorf("failed to start tap pods on time, err: %v", err) t.Errorf("failed to start tap pods on time, err: %v", err)
return return
} }
proxyUrl := GetProxyUrl(defaultNamespaceName, defaultServiceName) proxyUrl := GetProxyUrl(DefaultNamespaceName, DefaultServiceName)
for i := 0; i < defaultEntriesCount; i++ { for i := 0; i < DefaultEntriesCount; i++ {
response, requestErr := http.Post(fmt.Sprintf("%v/post", proxyUrl), "text/plain", bytes.NewBufferString("Mizu")) response, requestErr := http.Post(fmt.Sprintf("%v/post", proxyUrl), "text/plain", bytes.NewBufferString("Mizu"))
if _, requestErr = ExecuteHttpRequest(response, requestErr); requestErr != nil { if _, requestErr = ExecuteHttpRequest(response, requestErr); requestErr != nil {
t.Errorf("failed to send proxy request, err: %v", requestErr) t.Errorf("failed to send proxy request, err: %v", requestErr)
@@ -510,25 +515,25 @@ func TestTapIgnoredUserAgents(t *testing.T) {
return return
} }
apiServerUrl := GetApiServerUrl(defaultApiServerPort) apiServerUrl := GetApiServerUrl(DefaultApiServerPort)
if err := WaitTapPodsReady(apiServerUrl); err != nil { if err := WaitTapPodsReady(apiServerUrl); err != nil {
t.Errorf("failed to start tap pods on time, err: %v", err) t.Errorf("failed to start tap pods on time, err: %v", err)
return return
} }
proxyUrl := GetProxyUrl(defaultNamespaceName, defaultServiceName) proxyUrl := GetProxyUrl(DefaultNamespaceName, DefaultServiceName)
ignoredUserAgentCustomHeader := "Ignored-User-Agent" ignoredUserAgentCustomHeader := "Ignored-User-Agent"
headers := map[string]string{"User-Agent": ignoredUserAgentValue, ignoredUserAgentCustomHeader: ""} headers := map[string]string{"User-Agent": ignoredUserAgentValue, ignoredUserAgentCustomHeader: ""}
for i := 0; i < defaultEntriesCount; i++ { for i := 0; i < DefaultEntriesCount; i++ {
if _, requestErr := ExecuteHttpGetRequestWithHeaders(fmt.Sprintf("%v/get", proxyUrl), headers); requestErr != nil { if _, requestErr := ExecuteHttpGetRequestWithHeaders(fmt.Sprintf("%v/get", proxyUrl), headers); requestErr != nil {
t.Errorf("failed to send proxy request, err: %v", requestErr) t.Errorf("failed to send proxy request, err: %v", requestErr)
return return
} }
} }
for i := 0; i < defaultEntriesCount; i++ { for i := 0; i < DefaultEntriesCount; i++ {
if _, requestErr := ExecuteHttpGetRequest(fmt.Sprintf("%v/get", proxyUrl)); requestErr != nil { if _, requestErr := ExecuteHttpGetRequest(fmt.Sprintf("%v/get", proxyUrl)); requestErr != nil {
t.Errorf("failed to send proxy request, err: %v", requestErr) t.Errorf("failed to send proxy request, err: %v", requestErr)
return return
@@ -564,7 +569,7 @@ func TestTapDumpLogs(t *testing.T) {
return return
} }
apiServerUrl := GetApiServerUrl(defaultApiServerPort) apiServerUrl := GetApiServerUrl(DefaultApiServerPort)
if err := WaitTapPodsReady(apiServerUrl); err != nil { if err := WaitTapPodsReady(apiServerUrl); err != nil {
t.Errorf("failed to start tap pods on time, err: %v", err) t.Errorf("failed to start tap pods on time, err: %v", err)
@@ -644,3 +649,44 @@ func TestTapDumpLogs(t *testing.T) {
return return
} }
} }
func TestIpResolving(t *testing.T) {
namespace := AllNamespaces
t.Log("add permissions for ip-resolution for current user")
if err := ApplyKubeFilesForTest(
t,
"minikube",
namespace,
"../cli/cmd/permissionFiles/permissions-all-namespaces-ip-resolution-optional.yaml",
); err != nil {
t.Errorf("failed to create k8s permissions, %v", err)
return
}
basicTapTest(t, true)
}
func TestRestrictedMode(t *testing.T) {
namespace := "mizu-tests"
t.Log("creating permissions for restricted user")
if err := ApplyKubeFilesForTest(
t,
"minikube",
namespace,
"../cli/cmd/permissionFiles/permissions-ns-tap.yaml",
); err != nil {
t.Errorf("failed to create k8s permissions, %v", err)
return
}
t.Log("switching k8s context to user")
if err := SwitchKubeContextForTest(t, "user-with-restricted-access"); err != nil {
t.Errorf("failed to switch k8s context, %v", err)
return
}
extraArgs := []string{"--set", fmt.Sprintf("mizu-resources-namespace=%s", namespace)}
t.Run("basic tap", func (testingT *testing.T) {basicTapTest(testingT, false, extraArgs...)})
}

View File

@@ -24,13 +24,14 @@ import (
) )
const ( const (
longRetriesCount = 100 LongRetriesCount = 100
shortRetriesCount = 10 ShortRetriesCount = 10
defaultApiServerPort = shared.DefaultApiServerPort DefaultApiServerPort = shared.DefaultApiServerPort
defaultNamespaceName = "mizu-tests" DefaultNamespaceName = "mizu-tests"
defaultServiceName = "httpbin" DefaultServiceName = "httpbin"
defaultEntriesCount = 50 DefaultEntriesCount = 50
waitAfterTapPodsReady = 3 * time.Second WaitAfterTapPodsReady = 3 * time.Second
AllNamespaces = ""
) )
type PodDescriptor struct { type PodDescriptor struct {
@@ -74,7 +75,7 @@ func GetApiServerUrl(port uint16) string {
return fmt.Sprintf("http://localhost:%v", port) return fmt.Sprintf("http://localhost:%v", port)
} }
func GetServiceExternalIp(ctx context.Context, namespace string, service string) (string, error) { func NewKubernetesProvider() (*KubernetesProvider, error) {
home := homedir.HomeDir() home := homedir.HomeDir()
configLoadingRules := &clientcmd.ClientConfigLoadingRules{ExplicitPath: filepath.Join(home, ".kube", "config")} configLoadingRules := &clientcmd.ClientConfigLoadingRules{ExplicitPath: filepath.Join(home, ".kube", "config")}
clientConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig( clientConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(
@@ -86,15 +87,23 @@ func GetServiceExternalIp(ctx context.Context, namespace string, service string)
restClientConfig, err := clientConfig.ClientConfig() restClientConfig, err := clientConfig.ClientConfig()
if err != nil { if err != nil {
return "", err return nil, err
} }
clientSet, err := kubernetes.NewForConfig(restClientConfig) clientSet, err := kubernetes.NewForConfig(restClientConfig)
if err != nil { if err != nil {
return "", err return nil, err
} }
serviceObj, err := clientSet.CoreV1().Services(namespace).Get(ctx, service, metav1.GetOptions{}) return &KubernetesProvider{clientSet}, nil
}
type KubernetesProvider struct {
clientSet *kubernetes.Clientset
}
func (kp *KubernetesProvider) GetServiceExternalIp(ctx context.Context, namespace string, service string) (string, error) {
serviceObj, err := kp.clientSet.CoreV1().Services(namespace).Get(ctx, service, metav1.GetOptions{})
if err != nil { if err != nil {
return "", err return "", err
} }
@@ -103,10 +112,109 @@ func GetServiceExternalIp(ctx context.Context, namespace string, service string)
return externalIp, nil return externalIp, nil
} }
func SwitchKubeContextForTest(t *testing.T, newContextName string) error {
prevKubeContextName, err := GetKubeCurrentContextName()
if err != nil {
return err
}
if err := SetKubeCurrentContext(newContextName); err != nil {
return err
}
t.Cleanup(func() {
if err := SetKubeCurrentContext(prevKubeContextName); err != nil {
t.Errorf("failed to set Kubernetes context to %s, err: %v", prevKubeContextName, err)
t.Errorf("cleanup failed, subsequent tests may be affected")
}
})
return nil
}
func GetKubeCurrentContextName() (string, error) {
cmd := exec.Command("kubectl", "config", "current-context")
output, err := cmd.CombinedOutput()
if err != nil {
return "", fmt.Errorf("%v, %s", err, string(output))
}
return string(bytes.TrimSpace(output)), nil
}
func SetKubeCurrentContext(contextName string) error {
cmd := exec.Command("kubectl", "config", "use-context", contextName)
if output, err := cmd.CombinedOutput(); err != nil {
return fmt.Errorf("%v, %s", err, string(output))
}
return nil
}
func ApplyKubeFilesForTest(t *testing.T, kubeContext string, namespace string, filename ...string) error {
for i := range filename {
fname := filename[i]
if err := ApplyKubeFile(kubeContext, namespace, fname); err != nil {
return err
}
t.Cleanup(func() {
if err := DeleteKubeFile(kubeContext, namespace, fname); err != nil {
t.Errorf(
"failed to delete Kubernetes resources in namespace %s from filename %s, err: %v",
namespace,
fname,
err,
)
}
})
}
return nil
}
func ApplyKubeFile(kubeContext string, namespace string, filename string) (error) {
cmdArgs := []string{
"apply",
"--context", kubeContext,
"-f", filename,
}
if namespace != AllNamespaces {
cmdArgs = append(cmdArgs, "-n", namespace)
}
cmd := exec.Command("kubectl", cmdArgs...)
if output, err := cmd.CombinedOutput(); err != nil {
return fmt.Errorf("%v, %s", err, string(output))
}
return nil
}
func DeleteKubeFile(kubeContext string, namespace string, filename string) error {
cmdArgs := []string{
"delete",
"--context", kubeContext,
"-f", filename,
}
if namespace != AllNamespaces {
cmdArgs = append(cmdArgs, "-n", namespace)
}
cmd := exec.Command("kubectl", cmdArgs...)
if output, err := cmd.CombinedOutput(); err != nil {
return fmt.Errorf("%v, %s", err, string(output))
}
return nil
}
func getDefaultCommandArgs() []string { func getDefaultCommandArgs() []string {
setFlag := "--set" setFlag := "--set"
telemetry := "telemetry=false" telemetry := "telemetry=false"
agentImage := "agent-image=gcr.io/up9-docker-hub/mizu/ci:0.0" agentImage := "agent-image=mizu/ci:0.0"
imagePullPolicy := "image-pull-policy=IfNotPresent" imagePullPolicy := "image-pull-policy=IfNotPresent"
headless := "headless=true" headless := "headless=true"
@@ -157,11 +265,11 @@ func RunCypressTests(t *testing.T, cypressRunCmd string) {
t.Logf("%s", out) t.Logf("%s", out)
} }
func retriesExecute(retriesCount int, executeFunc func() error) error { func RetriesExecute(retriesCount int, executeFunc func() error) error {
var lastError interface{} var lastError interface{}
for i := 0; i < retriesCount; i++ { for i := 0; i < retriesCount; i++ {
if err := tryExecuteFunc(executeFunc); err != nil { if err := TryExecuteFunc(executeFunc); err != nil {
lastError = err lastError = err
time.Sleep(1 * time.Second) time.Sleep(1 * time.Second)
@@ -174,7 +282,7 @@ func retriesExecute(retriesCount int, executeFunc func() error) error {
return fmt.Errorf("reached max retries count, retries count: %v, last err: %v", retriesCount, lastError) return fmt.Errorf("reached max retries count, retries count: %v, last err: %v", retriesCount, lastError)
} }
func tryExecuteFunc(executeFunc func() error) (err interface{}) { func TryExecuteFunc(executeFunc func() error) (err interface{}) {
defer func() { defer func() {
if panicErr := recover(); panicErr != nil { if panicErr := recover(); panicErr != nil {
err = panicErr err = panicErr
@@ -196,14 +304,14 @@ func WaitTapPodsReady(apiServerUrl string) error {
if connectedTappersCount == 0 { if connectedTappersCount == 0 {
return fmt.Errorf("no connected tappers running") return fmt.Errorf("no connected tappers running")
} }
time.Sleep(waitAfterTapPodsReady) time.Sleep(WaitAfterTapPodsReady)
return nil return nil
} }
return retriesExecute(longRetriesCount, tapPodsReadyFunc) return RetriesExecute(LongRetriesCount, tapPodsReadyFunc)
} }
func jsonBytesToInterface(jsonBytes []byte) (interface{}, error) { func JsonBytesToInterface(jsonBytes []byte) (interface{}, error) {
var result interface{} var result interface{}
if parseErr := json.Unmarshal(jsonBytes, &result); parseErr != nil { if parseErr := json.Unmarshal(jsonBytes, &result); parseErr != nil {
return nil, parseErr return nil, parseErr
@@ -226,7 +334,7 @@ func ExecuteHttpRequest(response *http.Response, requestErr error) (interface{},
return nil, readErr return nil, readErr
} }
return jsonBytesToInterface(data) return JsonBytesToInterface(data)
} }
func ExecuteHttpGetRequestWithHeaders(url string, headers map[string]string) (interface{}, error) { func ExecuteHttpGetRequestWithHeaders(url string, headers map[string]string) (interface{}, error) {

View File

@@ -22,7 +22,7 @@ require (
github.com/ory/kratos-client-go v0.8.2-alpha.1 github.com/ory/kratos-client-go v0.8.2-alpha.1
github.com/patrickmn/go-cache v2.1.0+incompatible github.com/patrickmn/go-cache v2.1.0+incompatible
github.com/stretchr/testify v1.7.0 github.com/stretchr/testify v1.7.0
github.com/up9inc/basenine/client/go v0.0.0-20220220204122-0ef8cb24fab1 github.com/up9inc/basenine/client/go v0.0.0-20220302182733-74dc40dc2ef0
github.com/up9inc/mizu/shared v0.0.0 github.com/up9inc/mizu/shared v0.0.0
github.com/up9inc/mizu/tap v0.0.0 github.com/up9inc/mizu/tap v0.0.0
github.com/up9inc/mizu/tap/api v0.0.0 github.com/up9inc/mizu/tap/api v0.0.0

View File

@@ -855,6 +855,12 @@ github.com/ugorji/go/codec v1.2.6 h1:7kbGefxLoDBuYXOms4yD7223OpNMMPNPZxXk5TvFcyQ
github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxWFFpvxTw= github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxWFFpvxTw=
github.com/up9inc/basenine/client/go v0.0.0-20220220204122-0ef8cb24fab1 h1:0XN8s3HtwUBr9hbWRAFulFMsu1f2cabfJbwpz/sOoLA= github.com/up9inc/basenine/client/go v0.0.0-20220220204122-0ef8cb24fab1 h1:0XN8s3HtwUBr9hbWRAFulFMsu1f2cabfJbwpz/sOoLA=
github.com/up9inc/basenine/client/go v0.0.0-20220220204122-0ef8cb24fab1/go.mod h1:SvJGPoa/6erhUQV7kvHBwM/0x5LyO6XaG2lUaCaKiUI= github.com/up9inc/basenine/client/go v0.0.0-20220220204122-0ef8cb24fab1/go.mod h1:SvJGPoa/6erhUQV7kvHBwM/0x5LyO6XaG2lUaCaKiUI=
github.com/up9inc/basenine/client/go v0.0.0-20220301135911-d2111357b14e h1:nv/A/AeF8PcU91aHAj6o2cU8fl/46v0ZLj7wgIKjv+o=
github.com/up9inc/basenine/client/go v0.0.0-20220301135911-d2111357b14e/go.mod h1:SvJGPoa/6erhUQV7kvHBwM/0x5LyO6XaG2lUaCaKiUI=
github.com/up9inc/basenine/client/go v0.0.0-20220302073458-c32e0adf1500 h1:T1QHxt65NMete/GobVSvcHnwZAQibvahhrMTCgtnSS4=
github.com/up9inc/basenine/client/go v0.0.0-20220302073458-c32e0adf1500/go.mod h1:SvJGPoa/6erhUQV7kvHBwM/0x5LyO6XaG2lUaCaKiUI=
github.com/up9inc/basenine/client/go v0.0.0-20220302182733-74dc40dc2ef0 h1:mSqZuJJV4UZyaAoC8x7/AO7DLidlXepFyU18Vm3rFiA=
github.com/up9inc/basenine/client/go v0.0.0-20220302182733-74dc40dc2ef0/go.mod h1:SvJGPoa/6erhUQV7kvHBwM/0x5LyO6XaG2lUaCaKiUI=
github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw=
github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74 h1:gga7acRE695APm9hlsSMoOoE65U4/TcqNj90mc69Rlg= github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74 h1:gga7acRE695APm9hlsSMoOoE65U4/TcqNj90mc69Rlg=
github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vishvananda/netns v0.0.0-20211101163701-50045581ed74/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=

View File

@@ -86,7 +86,7 @@ func hostApi(socketHarOutputChannel chan<- *tapApi.OutputChannelItem) *gin.Engin
app := gin.Default() app := gin.Default()
app.GET("/echo", func(c *gin.Context) { app.GET("/echo", func(c *gin.Context) {
c.String(http.StatusOK, "Here is Mizu agent") c.JSON(http.StatusOK, "Here is Mizu agent")
}) })
eventHandlers := api.RoutesEventHandlers{ eventHandlers := api.RoutesEventHandlers{
@@ -140,7 +140,7 @@ func runInApiServerMode(namespace string) *gin.Engine {
if err := config.LoadConfig(); err != nil { if err := config.LoadConfig(); err != nil {
logger.Log.Fatalf("Error loading config file %v", err) logger.Log.Fatalf("Error loading config file %v", err)
} }
app.ConfigureBasenineServer(shared.BasenineHost, shared.BaseninePort, config.Config.MaxDBSizeBytes, config.Config.LogLevel) app.ConfigureBasenineServer(shared.BasenineHost, shared.BaseninePort, config.Config.MaxDBSizeBytes, config.Config.LogLevel, config.Config.InsertionFilter)
startTime = time.Now().UnixNano() / int64(time.Millisecond) startTime = time.Now().UnixNano() / int64(time.Millisecond)
api.StartResolving(namespace) api.StartResolving(namespace)

View File

@@ -62,7 +62,7 @@ func LoadExtensions() {
controllers.InitExtensionsMap(ExtensionsMap) controllers.InitExtensionsMap(ExtensionsMap)
} }
func ConfigureBasenineServer(host string, port string, dbSize int64, logLevel logging.Level) { func ConfigureBasenineServer(host string, port string, dbSize int64, logLevel logging.Level, insertionFilter string) {
if !wait.New( if !wait.New(
wait.WithProto("tcp"), wait.WithProto("tcp"),
wait.WithWait(200*time.Millisecond), wait.WithWait(200*time.Millisecond),
@@ -86,6 +86,11 @@ func ConfigureBasenineServer(host string, port string, dbSize int64, logLevel lo
} }
} }
} }
// Set the insertion filter that comes from the config
if err := basenine.InsertionFilter(host, port, insertionFilter); err != nil {
logger.Log.Errorf("Error while setting the insertion filter: %v", err)
}
} }
func GetEntryInputChannel() chan *tapApi.OutputChannelItem { func GetEntryInputChannel() chan *tapApi.OutputChannelItem {

View File

@@ -4,13 +4,14 @@ import (
"bytes" "bytes"
"crypto/tls" "crypto/tls"
"encoding/json" "encoding/json"
"net/http"
"sync"
"time"
"github.com/elastic/go-elasticsearch/v7" "github.com/elastic/go-elasticsearch/v7"
"github.com/up9inc/mizu/shared" "github.com/up9inc/mizu/shared"
"github.com/up9inc/mizu/shared/logger" "github.com/up9inc/mizu/shared/logger"
"github.com/up9inc/mizu/tap/api" "github.com/up9inc/mizu/tap/api"
"net/http"
"sync"
"time"
) )
type client struct { type client struct {
@@ -31,6 +32,9 @@ func GetInstance() *client {
func (client *client) Configure(config shared.ElasticConfig) { func (client *client) Configure(config shared.ElasticConfig) {
if config.Url == "" || config.User == "" || config.Password == "" { if config.Url == "" || config.User == "" || config.Password == "" {
if client.es != nil {
client.es = nil
}
logger.Log.Infof("No elastic configuration was supplied, elastic exporter disabled") logger.Log.Infof("No elastic configuration was supplied, elastic exporter disabled")
return return
} }
@@ -46,13 +50,13 @@ func (client *client) Configure(config shared.ElasticConfig) {
es, err := elasticsearch.NewClient(cfg) es, err := elasticsearch.NewClient(cfg)
if err != nil { if err != nil {
logger.Log.Fatalf("Failed to initialize elastic client %v", err) logger.Log.Errorf("Failed to initialize elastic client %v", err)
} }
// Have the client instance return a response // Have the client instance return a response
res, err := es.Info() res, err := es.Info()
if err != nil { if err != nil {
logger.Log.Fatalf("Elastic client.Info() ERROR: %v", err) logger.Log.Errorf("Elastic client.Info() ERROR: %v", err)
} else { } else {
client.es = es client.es = es
client.index = "mizu_traffic_http_" + time.Now().Format("2006_01_02_15_04") client.index = "mizu_traffic_http_" + time.Now().Format("2006_01_02_15_04")

View File

@@ -33,10 +33,23 @@ func (g *oasGenerator) Start() {
g.entriesChan = make(chan EntryWithSource, 100) // buffer up to 100 entries for OAS processing g.entriesChan = make(chan EntryWithSource, 100) // buffer up to 100 entries for OAS processing
g.ServiceSpecs = &sync.Map{} g.ServiceSpecs = &sync.Map{}
g.started = true g.started = true
go instance.runGeneretor() go instance.runGenerator()
} }
func (g *oasGenerator) runGeneretor() { func (g *oasGenerator) Stop() {
if !g.started {
return
}
g.cancel()
g.Reset()
g.started = false
}
func (g *oasGenerator) IsStarted() bool {
return g.started
}
func (g *oasGenerator) runGenerator() {
for { for {
select { select {
case <-g.ctx.Done(): case <-g.ctx.Done():

View File

@@ -32,6 +32,7 @@ type serviceMap struct {
type ServiceMap interface { type ServiceMap interface {
Enable() Enable()
Disable()
IsEnabled() bool IsEnabled() bool
NewTCPEntry(source *tapApi.TCP, destination *tapApi.TCP, protocol *tapApi.Protocol) NewTCPEntry(source *tapApi.TCP, destination *tapApi.TCP, protocol *tapApi.Protocol)
GetStatus() ServiceMapStatus GetStatus() ServiceMapStatus
@@ -159,6 +160,11 @@ func (s *serviceMap) Enable() {
s.enabled = true s.enabled = true
} }
func (s *serviceMap) Disable() {
s.Reset()
s.enabled = false
}
func (s *serviceMap) IsEnabled() bool { func (s *serviceMap) IsEnabled() bool {
return s.enabled return s.enabled
} }

View File

@@ -65,7 +65,7 @@ func runMizuCheck() {
func checkKubernetesApi() (*kubernetes.Provider, *semver.SemVersion, bool) { func checkKubernetesApi() (*kubernetes.Provider, *semver.SemVersion, bool) {
logger.Log.Infof("\nkubernetes-api\n--------------------") logger.Log.Infof("\nkubernetes-api\n--------------------")
kubernetesProvider, err := kubernetes.NewProvider(config.Config.KubeConfigPath()) kubernetesProvider, err := kubernetes.NewProvider(config.Config.KubeConfigPath(), config.Config.KubeContext)
if err != nil { if err != nil {
logger.Log.Errorf("%v can't initialize the client, err: %v", fmt.Sprintf(uiUtils.Red, "✗"), err) logger.Log.Errorf("%v can't initialize the client, err: %v", fmt.Sprintf(uiUtils.Red, "✗"), err)
return nil, nil, false return nil, nil, false

View File

@@ -61,7 +61,7 @@ func startProxyReportErrorIfAny(kubernetesProvider *kubernetes.Provider, ctx con
} }
func getKubernetesProviderForCli() (*kubernetes.Provider, error) { func getKubernetesProviderForCli() (*kubernetes.Provider, error) {
kubernetesProvider, err := kubernetes.NewProvider(config.Config.KubeConfigPath()) kubernetesProvider, err := kubernetes.NewProvider(config.Config.KubeConfigPath(), config.Config.KubeContext)
if err != nil { if err != nil {
handleKubernetesProviderError(err) handleKubernetesProviderError(err)
return nil, err return nil, err

View File

@@ -17,7 +17,7 @@ metadata:
name: mizu-runner-debug-clusterrolebindings name: mizu-runner-debug-clusterrolebindings
subjects: subjects:
- kind: User - kind: User
name: user1 name: user-with-clusterwide-access
apiGroup: rbac.authorization.k8s.io apiGroup: rbac.authorization.k8s.io
roleRef: roleRef:
kind: ClusterRole kind: ClusterRole

View File

@@ -29,7 +29,7 @@ metadata:
name: mizu-resolver-clusterrolebindings name: mizu-resolver-clusterrolebindings
subjects: subjects:
- kind: User - kind: User
name: user1 name: user-with-clusterwide-access
apiGroup: rbac.authorization.k8s.io apiGroup: rbac.authorization.k8s.io
roleRef: roleRef:
kind: ClusterRole kind: ClusterRole

View File

@@ -22,6 +22,9 @@ rules:
- apiGroups: [""] - apiGroups: [""]
resources: ["configmaps"] resources: ["configmaps"]
verbs: ["create"] verbs: ["create"]
- apiGroups: [""]
resources: ["pods/log"]
verbs: ["get"]
--- ---
kind: ClusterRoleBinding kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1 apiVersion: rbac.authorization.k8s.io/v1
@@ -29,7 +32,7 @@ metadata:
name: mizu-runner-clusterrolebindings name: mizu-runner-clusterrolebindings
subjects: subjects:
- kind: User - kind: User
name: user1 name: user-with-clusterwide-access
apiGroup: rbac.authorization.k8s.io apiGroup: rbac.authorization.k8s.io
roleRef: roleRef:
kind: ClusterRole kind: ClusterRole

View File

@@ -3,7 +3,6 @@ kind: Role
apiVersion: rbac.authorization.k8s.io/v1 apiVersion: rbac.authorization.k8s.io/v1
metadata: metadata:
name: mizu-runner-debug-role name: mizu-runner-debug-role
namespace: user1
rules: rules:
- apiGroups: ["events.k8s.io"] - apiGroups: ["events.k8s.io"]
resources: ["events"] resources: ["events"]
@@ -16,10 +15,9 @@ kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1 apiVersion: rbac.authorization.k8s.io/v1
metadata: metadata:
name: mizu-runner-debug-rolebindings name: mizu-runner-debug-rolebindings
namespace: user1
subjects: subjects:
- kind: User - kind: User
name: user1 name: user-with-restricted-access
apiGroup: rbac.authorization.k8s.io apiGroup: rbac.authorization.k8s.io
roleRef: roleRef:
kind: Role kind: Role

View File

@@ -3,7 +3,6 @@ kind: Role
apiVersion: rbac.authorization.k8s.io/v1 apiVersion: rbac.authorization.k8s.io/v1
metadata: metadata:
name: mizu-resolver-role name: mizu-resolver-role
namespace: user1
rules: rules:
- apiGroups: [""] - apiGroups: [""]
resources: ["serviceaccounts"] resources: ["serviceaccounts"]
@@ -28,10 +27,9 @@ kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1 apiVersion: rbac.authorization.k8s.io/v1
metadata: metadata:
name: mizu-resolver-rolebindings name: mizu-resolver-rolebindings
namespace: user1
subjects: subjects:
- kind: User - kind: User
name: user1 name: user-with-restricted-access
apiGroup: rbac.authorization.k8s.io apiGroup: rbac.authorization.k8s.io
roleRef: roleRef:
kind: Role kind: Role

View File

@@ -3,7 +3,6 @@ kind: Role
apiVersion: rbac.authorization.k8s.io/v1 apiVersion: rbac.authorization.k8s.io/v1
metadata: metadata:
name: mizu-runner-role name: mizu-runner-role
namespace: user1
rules: rules:
- apiGroups: [""] - apiGroups: [""]
resources: ["pods"] resources: ["pods"]
@@ -20,15 +19,17 @@ rules:
- apiGroups: [""] - apiGroups: [""]
resources: ["configmaps"] resources: ["configmaps"]
verbs: ["create", "delete"] verbs: ["create", "delete"]
- apiGroups: [""]
resources: ["pods/log"]
verbs: ["get"]
--- ---
kind: RoleBinding kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1 apiVersion: rbac.authorization.k8s.io/v1
metadata: metadata:
name: mizu-runner-rolebindings name: mizu-runner-rolebindings
namespace: user1
subjects: subjects:
- kind: User - kind: User
name: user1 name: user-with-restricted-access
apiGroup: rbac.authorization.k8s.io apiGroup: rbac.authorization.k8s.io
roleRef: roleRef:
kind: Role kind: Role

View File

@@ -3,9 +3,10 @@ package cmd
import ( import (
"errors" "errors"
"fmt" "fmt"
"github.com/up9inc/mizu/cli/up9"
"os" "os"
"github.com/up9inc/mizu/cli/up9"
"github.com/creasty/defaults" "github.com/creasty/defaults"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/up9inc/mizu/cli/auth" "github.com/up9inc/mizu/cli/auth"
@@ -115,6 +116,7 @@ func init() {
tapCmd.Flags().StringSliceP(configStructs.PlainTextFilterRegexesTapName, "r", defaultTapConfig.PlainTextFilterRegexes, "List of regex expressions that are used to filter matching values from text/plain http bodies") tapCmd.Flags().StringSliceP(configStructs.PlainTextFilterRegexesTapName, "r", defaultTapConfig.PlainTextFilterRegexes, "List of regex expressions that are used to filter matching values from text/plain http bodies")
tapCmd.Flags().Bool(configStructs.DisableRedactionTapName, defaultTapConfig.DisableRedaction, "Disables redaction of potentially sensitive request/response headers and body values") tapCmd.Flags().Bool(configStructs.DisableRedactionTapName, defaultTapConfig.DisableRedaction, "Disables redaction of potentially sensitive request/response headers and body values")
tapCmd.Flags().String(configStructs.HumanMaxEntriesDBSizeTapName, defaultTapConfig.HumanMaxEntriesDBSize, "Override the default max entries db size") tapCmd.Flags().String(configStructs.HumanMaxEntriesDBSizeTapName, defaultTapConfig.HumanMaxEntriesDBSize, "Override the default max entries db size")
tapCmd.Flags().String(configStructs.InsertionFilterName, defaultTapConfig.InsertionFilter, "Set the insertion filter. Accepts string or a file path.")
tapCmd.Flags().Bool(configStructs.DryRunTapName, defaultTapConfig.DryRun, "Preview of all pods matching the regex, without tapping them") tapCmd.Flags().Bool(configStructs.DryRunTapName, defaultTapConfig.DryRun, "Preview of all pods matching the regex, without tapping them")
tapCmd.Flags().StringP(configStructs.WorkspaceTapName, "w", defaultTapConfig.Workspace, "Uploads traffic to your UP9 workspace for further analysis (requires auth)") tapCmd.Flags().StringP(configStructs.WorkspaceTapName, "w", defaultTapConfig.Workspace, "Uploads traffic to your UP9 workspace for further analysis (requires auth)")
tapCmd.Flags().String(configStructs.EnforcePolicyFile, defaultTapConfig.EnforcePolicyFile, "Yaml file path with policy rules") tapCmd.Flags().String(configStructs.EnforcePolicyFile, defaultTapConfig.EnforcePolicyFile, "Yaml file path with policy rules")

View File

@@ -154,6 +154,7 @@ func finishTapExecution(kubernetesProvider *kubernetes.Provider) {
func getTapMizuAgentConfig() *shared.MizuAgentConfig { func getTapMizuAgentConfig() *shared.MizuAgentConfig {
mizuAgentConfig := shared.MizuAgentConfig{ mizuAgentConfig := shared.MizuAgentConfig{
MaxDBSizeBytes: config.Config.Tap.MaxEntriesDBSizeBytes(), MaxDBSizeBytes: config.Config.Tap.MaxEntriesDBSizeBytes(),
InsertionFilter: config.Config.Tap.GetInsertionFilter(),
AgentImage: config.Config.AgentImage, AgentImage: config.Config.AgentImage,
PullPolicy: config.Config.ImagePullPolicyStr, PullPolicy: config.Config.ImagePullPolicyStr,
LogLevel: config.Config.LogLevel(), LogLevel: config.Config.LogLevel(),

View File

@@ -36,6 +36,7 @@ type ConfigStruct struct {
Telemetry bool `yaml:"telemetry" default:"true"` Telemetry bool `yaml:"telemetry" default:"true"`
DumpLogs bool `yaml:"dump-logs" default:"false"` DumpLogs bool `yaml:"dump-logs" default:"false"`
KubeConfigPathStr string `yaml:"kube-config-path"` KubeConfigPathStr string `yaml:"kube-config-path"`
KubeContext string `yaml:"kube-context"`
ConfigFilePath string `yaml:"config-path,omitempty" readonly:""` ConfigFilePath string `yaml:"config-path,omitempty" readonly:""`
HeadlessMode bool `yaml:"headless" default:"false"` HeadlessMode bool `yaml:"headless" default:"false"`
LogLevelStr string `yaml:"log-level,omitempty" default:"INFO" readonly:""` LogLevelStr string `yaml:"log-level,omitempty" default:"INFO" readonly:""`

View File

@@ -3,10 +3,16 @@ package configStructs
import ( import (
"errors" "errors"
"fmt" "fmt"
"io/fs"
"io/ioutil"
"os"
"regexp" "regexp"
"github.com/up9inc/mizu/cli/uiUtils"
"github.com/up9inc/mizu/shared" "github.com/up9inc/mizu/shared"
basenine "github.com/up9inc/basenine/server/lib"
"github.com/up9inc/mizu/shared/logger"
"github.com/up9inc/mizu/shared/units" "github.com/up9inc/mizu/shared/units"
) )
@@ -18,6 +24,7 @@ const (
PlainTextFilterRegexesTapName = "regex-masking" PlainTextFilterRegexesTapName = "regex-masking"
DisableRedactionTapName = "no-redact" DisableRedactionTapName = "no-redact"
HumanMaxEntriesDBSizeTapName = "max-entries-db-size" HumanMaxEntriesDBSizeTapName = "max-entries-db-size"
InsertionFilterName = "insertion-filter"
DryRunTapName = "dry-run" DryRunTapName = "dry-run"
WorkspaceTapName = "workspace" WorkspaceTapName = "workspace"
EnforcePolicyFile = "traffic-validation-file" EnforcePolicyFile = "traffic-validation-file"
@@ -27,26 +34,27 @@ const (
) )
type TapConfig struct { type TapConfig struct {
UploadIntervalSec int `yaml:"upload-interval" default:"10"` UploadIntervalSec int `yaml:"upload-interval" default:"10"`
PodRegexStr string `yaml:"regex" default:".*"` PodRegexStr string `yaml:"regex" default:".*"`
GuiPort uint16 `yaml:"gui-port" default:"8899"` GuiPort uint16 `yaml:"gui-port" default:"8899"`
ProxyHost string `yaml:"proxy-host" default:"127.0.0.1"` ProxyHost string `yaml:"proxy-host" default:"127.0.0.1"`
Namespaces []string `yaml:"namespaces"` Namespaces []string `yaml:"namespaces"`
Analysis bool `yaml:"analysis" default:"false"` Analysis bool `yaml:"analysis" default:"false"`
AllNamespaces bool `yaml:"all-namespaces" default:"false"` AllNamespaces bool `yaml:"all-namespaces" default:"false"`
PlainTextFilterRegexes []string `yaml:"regex-masking"` PlainTextFilterRegexes []string `yaml:"regex-masking"`
IgnoredUserAgents []string `yaml:"ignored-user-agents"` IgnoredUserAgents []string `yaml:"ignored-user-agents"`
DisableRedaction bool `yaml:"no-redact" default:"false"` DisableRedaction bool `yaml:"no-redact" default:"false"`
HumanMaxEntriesDBSize string `yaml:"max-entries-db-size" default:"200MB"` HumanMaxEntriesDBSize string `yaml:"max-entries-db-size" default:"200MB"`
DryRun bool `yaml:"dry-run" default:"false"` InsertionFilter string `yaml:"insertion-filter" default:""`
Workspace string `yaml:"workspace"` DryRun bool `yaml:"dry-run" default:"false"`
EnforcePolicyFile string `yaml:"traffic-validation-file"` Workspace string `yaml:"workspace"`
ContractFile string `yaml:"contract"` EnforcePolicyFile string `yaml:"traffic-validation-file"`
AskUploadConfirmation bool `yaml:"ask-upload-confirmation" default:"true"` ContractFile string `yaml:"contract"`
ApiServerResources shared.Resources `yaml:"api-server-resources"` AskUploadConfirmation bool `yaml:"ask-upload-confirmation" default:"true"`
TapperResources shared.Resources `yaml:"tapper-resources"` ApiServerResources shared.Resources `yaml:"api-server-resources"`
ServiceMesh bool `yaml:"service-mesh" default:"false"` TapperResources shared.Resources `yaml:"tapper-resources"`
Tls bool `yaml:"tls" default:"false"` ServiceMesh bool `yaml:"service-mesh" default:"false"`
Tls bool `yaml:"tls" default:"false"`
} }
func (config *TapConfig) PodRegex() *regexp.Regexp { func (config *TapConfig) PodRegex() *regexp.Regexp {
@@ -59,6 +67,25 @@ func (config *TapConfig) MaxEntriesDBSizeBytes() int64 {
return maxEntriesDBSizeBytes return maxEntriesDBSizeBytes
} }
func (config *TapConfig) GetInsertionFilter() string {
insertionFilter := config.InsertionFilter
if fs.ValidPath(insertionFilter) {
if _, err := os.Stat(insertionFilter); err == nil {
b, err := ioutil.ReadFile(insertionFilter)
if err != nil {
logger.Log.Warningf(uiUtils.Warning, fmt.Sprintf("Couldn't read the file on path: %s, err: %v", insertionFilter, err))
} else {
insertionFilter = string(b)
}
}
}
_, err := basenine.Parse(insertionFilter)
if err != nil {
logger.Log.Warningf(uiUtils.Warning, fmt.Sprintf("Insertion filter syntax error: %v", err))
}
return insertionFilter
}
func (config *TapConfig) Validate() error { func (config *TapConfig) Validate() error {
_, compileErr := regexp.Compile(config.PodRegexStr) _, compileErr := regexp.Compile(config.PodRegexStr)
if compileErr != nil { if compileErr != nil {

View File

@@ -11,6 +11,7 @@ require (
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 github.com/op/go-logging v0.0.0-20160315200505-970db520ece7
github.com/spf13/cobra v1.3.0 github.com/spf13/cobra v1.3.0
github.com/spf13/pflag v1.0.5 github.com/spf13/pflag v1.0.5
github.com/up9inc/basenine/server/lib v0.0.0-20220302182733-74dc40dc2ef0
github.com/up9inc/mizu/shared v0.0.0 github.com/up9inc/mizu/shared v0.0.0
github.com/up9inc/mizu/tap/api v0.0.0 github.com/up9inc/mizu/tap/api v0.0.0
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8
@@ -32,8 +33,10 @@ require (
github.com/MakeNowJust/heredoc v1.0.0 // indirect github.com/MakeNowJust/heredoc v1.0.0 // indirect
github.com/PuerkitoBio/purell v1.1.1 // indirect github.com/PuerkitoBio/purell v1.1.1 // indirect
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
github.com/alecthomas/participle/v2 v2.0.0-alpha7 // indirect
github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 // indirect github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect
github.com/dlclark/regexp2 v1.4.0 // indirect
github.com/docker/go-units v0.4.0 // indirect github.com/docker/go-units v0.4.0 // indirect
github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect
github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect
@@ -68,6 +71,7 @@ require (
github.com/modern-go/reflect2 v1.0.2 // indirect github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect
github.com/ohler55/ojg v1.12.13 // indirect
github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
github.com/pkg/errors v0.9.1 // indirect github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect

View File

@@ -83,6 +83,10 @@ github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tN
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
github.com/alecthomas/participle/v2 v2.0.0-alpha7 h1:cK4vjj0VSgb3lN1nuKA5F7dw+1s1pWBe5bx7nNCnN+c=
github.com/alecthomas/participle/v2 v2.0.0-alpha7/go.mod h1:NumScqsC42o9x+dGj8/YqsIfhrIQjFEOFovxotbBirA=
github.com/alecthomas/repr v0.0.0-20181024024818-d37bc2a10ba1 h1:GDQdwm/gAcJcLAKQQZGOJ4knlw+7rfEQQcmwTbt4p5E=
github.com/alecthomas/repr v0.0.0-20181024024818-d37bc2a10ba1/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
@@ -149,6 +153,8 @@ github.com/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMS
github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI= github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E=
github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
@@ -479,6 +485,8 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWb
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
github.com/ohler55/ojg v1.12.13 h1:FvfVpYzLgMraLcg3rrXiRXaihOP6fnzQNEU9YyZ/AmM=
github.com/ohler55/ojg v1.12.13/go.mod h1:LBbIVRAgoFbYBXQhRhuEpaJIqq+goSO63/FQ+nyJU88=
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA=
github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
@@ -590,6 +598,8 @@ github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
github.com/up9inc/basenine/server/lib v0.0.0-20220302182733-74dc40dc2ef0 h1:9PQamOq285DyVsRlS4KB/x2+xkr5QlpiT9Y/BPutS4A=
github.com/up9inc/basenine/server/lib v0.0.0-20220302182733-74dc40dc2ef0/go.mod h1:R9bG4y/iq89jNC0xZ25uKDqenyKFTR3X9acGDOkKWSE=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg=
github.com/xlab/treeprint v1.1.0 h1:G/1DjNkPpfZCFt9CSh6b5/nY4VimlbHF3Rh4obvtzDk= github.com/xlab/treeprint v1.1.0 h1:G/1DjNkPpfZCFt9CSh6b5/nY4VimlbHF3Rh4obvtzDk=

View File

@@ -1,23 +0,0 @@
# Patterns to ignore when building packages.
# This supports shell glob matching, relative path matching, and
# negation (prefixed with !). Only one pattern per line.
.DS_Store
# Common VCS dirs
.git/
.gitignore
.bzr/
.bzrignore
.hg/
.hgignore
.svn/
# Common backup files
*.swp
*.bak
*.tmp
*.orig
*~
# Various IDEs
.project
.idea/
*.tmproj
.vscode/

View File

@@ -1,7 +0,0 @@
apiVersion: v2
name: mizuhelm
description: Mizu helm chart for Kubernetes
type: application
version: 0.1.1
kubeVersion: ">= 1.16.0-0"
appVersion: "0.21.29"

View File

@@ -1,13 +0,0 @@
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: {{ .Values.volumeClaim.name }}
namespace: {{ .Release.Namespace }}
spec:
accessModes:
- ReadWriteOnce
resources:
limits:
storage: 700M
requests:
storage: 700M

View File

@@ -1,30 +0,0 @@
{{- if .Values.rbac.create -}}
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: {{ .Values.rbac.name }}
namespace: {{ .Release.Namespace }}
labels:
mizu-cli-version: {{ .Chart.AppVersion }}
heritage: {{ .Release.Service }}
release: {{ .Release.Name }}
rules:
- apiGroups: [ "", "extensions", "apps" ]
resources: [ "endpoints", "pods", "services", "namespaces" ]
verbs: [ "get", "list", "watch" ]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: {{ .Values.rbac.roleBindingName }}
labels:
mizu-cli-version: {{ .Chart.AppVersion }}
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: {{ .Values.rbac.name }}
subjects:
- kind: ServiceAccount
name: {{ .Values.serviceAccountName }}
namespace: {{ .Release.Namespace }}
{{- end -}}

View File

@@ -1,8 +0,0 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Values.configMap.name }}
namespace: {{ .Release.Namespace }}
data:
mizu-config.json: >-
{"maxDBSizeBytes":200000000,"agentImage":"{{ .Values.container.tapper.image.repository }}:{{ .Values.container.tapper.image.tag }}","pullPolicy":"Always","logLevel":4,"tapperResources":{"CpuLimit":"750m","MemoryLimit":"1Gi","CpuRequests":"50m","MemoryRequests":"50Mi"},"mizuResourceNamespace":"{{ .Release.Namespace }}","agentDatabasePath":"/app/data/","standaloneMode":true}

View File

@@ -1,128 +0,0 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.pod.name }}
namespace: {{ .Release.Namespace }}
labels:
app: {{ .Values.pod.name }}
spec:
replicas: {{ .Values.deployment.replicaCount }}
selector:
matchLabels:
app: {{ .Values.pod.name }}
template:
metadata:
name: {{ .Values.pod.name }}
creationTimestamp: null
labels:
app: {{ .Values.pod.name }}
spec:
volumes:
- name: {{ .Values.configMap.name }}
configMap:
name: {{ .Values.configMap.name }}
defaultMode: 420
- name: {{ .Values.volumeClaim.name }}
persistentVolumeClaim:
claimName: {{ .Values.volumeClaim.name }}
containers:
- name: {{ .Values.pod.name }}
image: "{{ .Values.container.mizuAgent.image.repository }}:{{ .Values.container.mizuAgent.image.tag | default .Chart.AppVersion }}"
command:
- ./mizuagent
- '--api-server'
env:
- name: SYNC_ENTRIES_CONFIG
- name: LOG_LEVEL
value: INFO
resources:
limits:
cpu: 750m
memory: 1Gi
requests:
cpu: 50m
memory: 50Mi
volumeMounts:
- name: {{ .Values.configMap.name }}
mountPath: /app/config/
- name: {{ .Values.volumeClaim.name }}
mountPath: /app/data/
livenessProbe:
httpGet:
path: /echo
port: {{ .Values.pod.port }}
scheme: HTTP
initialDelaySeconds: 1
timeoutSeconds: 1
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
imagePullPolicy: Always
- name: {{ .Values.container.basenine.name }}
image: "{{ .Values.container.basenine.image.repository }}:{{ .Values.container.basenine.image.tag | default .Chart.AppVersion }}"
command:
- /basenine
args:
- '-addr'
- 0.0.0.0
- '-port'
- '9099'
- '-persistent'
workingDir: /app/data/
resources:
limits:
cpu: 750m
memory: 1Gi
requests:
cpu: 50m
memory: 50Mi
volumeMounts:
- name: {{ .Values.configMap.name }}
mountPath: /app/config/
- name: {{ .Values.volumeClaim.name }}
mountPath: /app/data/
readinessProbe:
tcpSocket:
port: 9099
timeoutSeconds: 1
periodSeconds: 1
successThreshold: 1
failureThreshold: 3
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
imagePullPolicy: Always
- name: kratos
image: "{{ .Values.container.kratos.image.repository }}:{{ .Values.container.kratos.image.tag | default .Chart.AppVersion }}"
resources:
limits:
cpu: 750m
memory: 1Gi
requests:
cpu: 50m
memory: 50Mi
volumeMounts:
- name: {{ .Values.configMap.name }}
mountPath: /app/config/
- name: {{ .Values.volumeClaim.name }}
mountPath: /app/data/
readinessProbe:
httpGet:
path: /health/ready
port: 4433
scheme: HTTP
timeoutSeconds: 1
periodSeconds: 1
successThreshold: 1
failureThreshold: 3
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
imagePullPolicy: Always
restartPolicy: Always
terminationGracePeriodSeconds: 0
dnsPolicy: ClusterFirstWithHostNet
serviceAccountName: {{ .Values.serviceAccountName }}
serviceAccount: {{ .Values.serviceAccountName }}
securityContext: { }
schedulerName: default-scheduler

View File

@@ -1,29 +0,0 @@
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: {{ .Values.roleName }}
namespace: {{ .Release.Namespace }}
labels:
mizu-cli-version: {{ .Chart.AppVersion }}
rules:
- apiGroups: [ "apps" ]
resources: [ "daemonsets" ]
verbs: [ "patch", "get", "list", "create", "delete" ]
- apiGroups: [ "events.k8s.i" ]
resources: [ "events" ]
verbs: [ "list", "watch" ]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: {{ .Values.roleBindingName }}
namespace: {{ .Release.Namespace }}
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: {{ .Values.roleName }}
subjects:
- kind: ServiceAccount
name: {{ .Values.serviceAccountName }}
namespace: {{ .Release.Namespace }}
---

View File

@@ -1,14 +0,0 @@
apiVersion: v1
kind: Service
metadata:
name: {{ .Values.service.name }}
namespace: {{ .Release.Namespace }}
spec:
type: {{ .Values.service.type }}
ports:
- name: api
port: {{ .Values.service.port }}
targetPort: {{ .Values.pod.port }}
protocol: TCP
selector:
app: {{ .Values.pod.name }}

View File

@@ -1,7 +0,0 @@
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ .Values.serviceAccountName }}
namespace: {{ .Release.Namespace }}
labels:
mizu-cli-version: {{ .Chart.AppVersion }}

View File

@@ -1,51 +0,0 @@
# Default values for mizu.
rbac:
create: true
name: "mizu-cluster-role"
roleBindingName: "mizu-role-binding"
serviceAccountName: "mizu-service-account"
roleName: "mizu-role-daemon"
roleBindingName: "mizu-role-binding-daemon"
service:
name: "mizu-api-server"
type: ClusterIP
port: 80
pod:
name: "mizu-api-server"
port: 8899
container:
mizuAgent:
image:
repository: "gcr.io/up9-docker-hub/mizu/main"
tag: "0.22.0"
tapper:
image:
repository: "gcr.io/up9-docker-hub/mizu/main"
tag: "0.22.0"
basenine:
name: "basenine"
port: 9099
image:
repository: "ghcr.io/up9inc/basenine"
tag: "v0.3.0"
kratos:
name: "kratos"
port: 4433
image:
repository: "gcr.io/up9-docker-hub/mizu-kratos/stable"
tag: "0.0.0"
deployment:
replicaCount: 1
configMap:
name: "mizu-config"
volumeClaim:
create: true
name: "mizu-volume-claim"

View File

@@ -1,15 +0,0 @@
#!/bin/bash
set -e
GCP_PROJECT=up9-docker-hub
REPOSITORY=gcr.io/$GCP_PROJECT
SERVER_NAME=mizu
GIT_BRANCH=ci
DOCKER_REPO=$REPOSITORY/$SERVER_NAME/$GIT_BRANCH
VER=${VER=0.0}
DOCKER_TAGGED_BUILD="$DOCKER_REPO:$VER"
echo "building $DOCKER_TAGGED_BUILD"
docker build -t ${DOCKER_TAGGED_BUILD} --build-arg VER=${VER} --build-arg BUILD_TIMESTAMP=${BUILD_TIMESTAMP} --build-arg GIT_BRANCH=${GIT_BRANCH} --build-arg COMMIT_HASH=${COMMIT_HASH} .

View File

@@ -56,8 +56,8 @@ const (
sysfsMountPath = "/sys" sysfsMountPath = "/sys"
) )
func NewProvider(kubeConfigPath string) (*Provider, error) { func NewProvider(kubeConfigPath string, contextName string) (*Provider, error) {
kubernetesConfig := loadKubernetesConfiguration(kubeConfigPath) kubernetesConfig := loadKubernetesConfiguration(kubeConfigPath, contextName)
restClientConfig, err := kubernetesConfig.ClientConfig() restClientConfig, err := kubernetesConfig.ClientConfig()
if err != nil { if err != nil {
if clientcmd.IsEmptyConfig(err) { if clientcmd.IsEmptyConfig(err) {
@@ -1212,7 +1212,7 @@ func ValidateKubernetesVersion(serverVersionSemVer *semver.SemVersion) error {
return nil return nil
} }
func loadKubernetesConfiguration(kubeConfigPath string) clientcmd.ClientConfig { func loadKubernetesConfiguration(kubeConfigPath string, context string) clientcmd.ClientConfig {
logger.Log.Debugf("Using kube config %s", kubeConfigPath) logger.Log.Debugf("Using kube config %s", kubeConfigPath)
configPathList := filepath.SplitList(kubeConfigPath) configPathList := filepath.SplitList(kubeConfigPath)
configLoadingRules := &clientcmd.ClientConfigLoadingRules{} configLoadingRules := &clientcmd.ClientConfigLoadingRules{}
@@ -1221,7 +1221,7 @@ func loadKubernetesConfiguration(kubeConfigPath string) clientcmd.ClientConfig {
} else { } else {
configLoadingRules.Precedence = configPathList configLoadingRules.Precedence = configPathList
} }
contextName := "" contextName := context
return clientcmd.NewNonInteractiveDeferredLoadingClientConfig( return clientcmd.NewNonInteractiveDeferredLoadingClientConfig(
configLoadingRules, configLoadingRules,
&clientcmd.ConfigOverrides{ &clientcmd.ConfigOverrides{

View File

@@ -35,6 +35,7 @@ type Resources struct {
type MizuAgentConfig struct { type MizuAgentConfig struct {
MaxDBSizeBytes int64 `json:"maxDBSizeBytes"` MaxDBSizeBytes int64 `json:"maxDBSizeBytes"`
InsertionFilter string `json:"insertionFilter"`
AgentImage string `json:"agentImage"` AgentImage string `json:"agentImage"`
PullPolicy string `json:"pullPolicy"` PullPolicy string `json:"pullPolicy"`
LogLevel logging.Level `json:"logLevel"` LogLevel logging.Level `json:"logLevel"`