mirror of
https://github.com/kubeshark/kubeshark.git
synced 2026-03-02 01:30:23 +00:00
Compare commits
10 Commits
29.0-dev4
...
29.0-dev14
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2c1aa9022b | ||
|
|
5af0c5a9e9 | ||
|
|
8217ac3ed0 | ||
|
|
de769131de | ||
|
|
5f8a5a3a29 | ||
|
|
7f4cb6dfd4 | ||
|
|
3b063c3bb5 | ||
|
|
b9f5475e3a | ||
|
|
346e904e77 | ||
|
|
c5471c501b |
12
.github/workflows/acceptance_tests.yml
vendored
12
.github/workflows/acceptance_tests.yml
vendored
@@ -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
2
.gitignore
vendored
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
7
Makefile
7
Makefile
@@ -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
37
acceptanceTests/create_user.sh
Executable 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}"
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
10
acceptanceTests/setup.sh
Normal file → Executable 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 &
|
||||||
|
|||||||
@@ -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...)})
|
||||||
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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=
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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():
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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(),
|
||||||
|
|||||||
@@ -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:""`
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
10
cli/go.sum
10
cli/go.sum
@@ -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=
|
||||||
|
|||||||
@@ -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/
|
|
||||||
@@ -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"
|
|
||||||
@@ -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
|
|
||||||
@@ -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 -}}
|
|
||||||
@@ -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}
|
|
||||||
@@ -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
|
|
||||||
@@ -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 }}
|
|
||||||
---
|
|
||||||
@@ -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 }}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
apiVersion: v1
|
|
||||||
kind: ServiceAccount
|
|
||||||
metadata:
|
|
||||||
name: {{ .Values.serviceAccountName }}
|
|
||||||
namespace: {{ .Release.Namespace }}
|
|
||||||
labels:
|
|
||||||
mizu-cli-version: {{ .Chart.AppVersion }}
|
|
||||||
@@ -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"
|
|
||||||
@@ -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} .
|
|
||||||
@@ -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{
|
||||||
|
|||||||
@@ -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"`
|
||||||
|
|||||||
Reference in New Issue
Block a user