Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions hack/prow/integration_docker_docker_linux_x86-64.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#!/bin/bash

# Copyright 2025 The Kubernetes Authors All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

set -e
set -x

OS="linux"
ARCH="amd64"
DRIVER="docker"
CONTAINER_RUNTIME="docker"
EXTRA_START_ARGS=""
EXTRA_TEST_ARGS=""
JOB_NAME="Docker_Linux"

git config --global --add safe.directory '*'
COMMIT=$(git rev-parse HEAD)
MINIKUBE_LOCATION=$COMMIT


# when docker is the driver, we run integration tests directly in prow cluster
# by default, prow jobs run in root, so we must switch to a non-root user to run docker driver


source ./hack/prow/common.sh
2 changes: 1 addition & 1 deletion hack/prow/integration_kvm_docker_linux_x86-64.sh
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ CONTAINER_RUNTIME="docker"
EXTRA_START_ARGS=""
EXTRA_TEST_ARGS=""
JOB_NAME="KVM_Linux"

git config --global --add safe.directory '*'
COMMIT=$(git rev-parse HEAD)
MINIKUBE_LOCATION=$COMMIT
echo "running test in $(pwd)"
Expand Down
7 changes: 7 additions & 0 deletions hack/prow/prow.mk
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
.PHONY: integration-prow-kvm-docker-linux-x86-64


integration-prow-docker-docker-linux-x86-64:
# build first
# container-runtime=docker driver=docker on linux/amd64
./hack/prow/minikube_cross_build.sh $(GO_VERSION) linux amd64
./hack/prow/util/integration_prow_wrapper.sh ./hack/prow/integration_docker_docker_linux_x86-64.sh

integration-prow-kvm-docker-linux-x86-64:
# build first
# container-runtime=docker driver=kvm on linux/amd64
Expand Down
30 changes: 30 additions & 0 deletions hack/prow/util/integration_prow_wrapper.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#!/bin/bash

# Copyright 2025 The Kubernetes Authors All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

set -x
TARGET_SCRIPT=$1
# run the target script with minikube user
./hack/prow/util/run_with_minikube_user.sh "$TARGET_SCRIPT"
result=$?
# collect the logs as root user
echo "test finished with exit code $result"

items=("testout.txt" "test.json" "junit-unit.xml" "test.html" "test_summary.json")
for item in "${items[@]}"; do
echo "Collecting ${item} to ${ARTIFACTS}/${item}"
cp "${item}" "${ARTIFACTS}/${item}"
done
exit $result
37 changes: 37 additions & 0 deletions hack/prow/util/run_with_minikube_user.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#!/bin/bash

# Copyright 2025 The Kubernetes Authors All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

set -e
set -x

# when docker is the driver, we run integration tests directly in prow cluster
# by default, prow jobs run in root, so we must switch to a non-root user to run docker driver
NEW_USER="minikube"
TARGET_SCRIPT=$1

if [ "$(whoami)" == "root" ]; then
useradd -m -s /bin/bash "$NEW_USER"
fi
chown -R "$NEW_USER":"$NEW_USER" .
# install sudo if not present
apt-get update && apt-get install -y sudo
# give the new user passwordless sudo
echo "$NEW_USER ALL=(ALL) NOPASSWD:ALL" > "/etc/sudoers.d/$NEW_USER"
chmod 440 "/etc/sudoers.d/$NEW_USER"
# add the new user to the docker group
usermod -aG docker "$NEW_USER"
# exec the target script as the new user
su "$NEW_USER" -c "$TARGET_SCRIPT"
21 changes: 17 additions & 4 deletions test/integration/scheduled_stop_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ func TestScheduledStopUnix(t *testing.T) {
startMinikube(ctx, t, profile)

// schedule a stop for 5 min from now and make sure PID is created
stopMinikube(ctx, t, profile, []string{"--schedule", "5m"})
stopMinikube(ctx, t, profile, []string{"--schedule", "5m", "-v=5", "--alsologtostderr"})
// make sure timeToStop is present in status
ensureMinikubeScheduledTime(ctx, t, profile, 5*time.Minute)
pid := checkPID(t, profile)
Expand All @@ -93,7 +93,7 @@ func TestScheduledStopUnix(t *testing.T) {
}

// schedule a second stop which should cancel the first scheduled stop
stopMinikube(ctx, t, profile, []string{"--schedule", "15s"})
stopMinikube(ctx, t, profile, []string{"--schedule", "15s", "-v=5", "--alsologtostderr"})
if processRunning(t, pid) {
t.Fatalf("process %v running but should have been killed on reschedule of stop", pid)
}
Expand All @@ -109,7 +109,7 @@ func TestScheduledStopUnix(t *testing.T) {
ensureTimeToStopNotPresent(ctx, t, profile)

// schedule another stop, make sure minikube status is "Stopped"
stopMinikube(ctx, t, profile, []string{"--schedule", "15s"})
stopMinikube(ctx, t, profile, []string{"--schedule", "15s", "-v=5", "--alsologtostderr"})
time.Sleep(15 * time.Second)
if processRunning(t, pid) {
t.Fatalf("process %v running but should have been killed on reschedule of stop", pid)
Expand Down Expand Up @@ -138,6 +138,9 @@ func stopMinikube(ctx context.Context, t *testing.T, profile string, additionalA
if err != nil {
t.Fatalf("stopping minikube: %v\n%s", err, rr.Output())
}
fmt.Println("minikube stop output:")
fmt.Println(rr.Output())

}

func checkPID(t *testing.T, profile string) string {
Expand Down Expand Up @@ -167,7 +170,17 @@ func processRunning(t *testing.T, pid string) bool {
}
err = process.Signal(syscall.Signal(0))
t.Log("signal error was: ", err)
return err == nil
if err != nil {
return false
}
// then check if this process has become a zombie process
// which is also not running
data, _ := os.ReadFile(fmt.Sprintf("/proc/%s/status", pid))
if strings.Contains(string(data), "State:\tZ") {
t.Logf("process %s is a zombie", pid)
return false
}
return true
}
func ensureMinikubeStatus(ctx context.Context, t *testing.T, profile, key string, wantStatus string) {
checkStatus := func() error {
Expand Down
Loading