diff --git a/cmd/interlink/main.go b/cmd/interlink/main.go index acb29825..4be4c500 100644 --- a/cmd/interlink/main.go +++ b/cmd/interlink/main.go @@ -193,6 +193,7 @@ func main() { mutex.HandleFunc("/pinglink", interLinkAPIs.Ping) mutex.HandleFunc("/getLogs", interLinkAPIs.GetLogsHandler) mutex.HandleFunc("/updateCache", interLinkAPIs.UpdateCacheHandler) + mutex.HandleFunc("/version", api.VersionHandler(interlink.Version)) interLinkEndpoint := "" switch { diff --git a/cmd/virtual-kubelet/set-version.sh b/cmd/virtual-kubelet/set-version.sh index d55fffa3..f33d7579 100755 --- a/cmd/virtual-kubelet/set-version.sh +++ b/cmd/virtual-kubelet/set-version.sh @@ -8,4 +8,9 @@ var ( KubeletVersion = "$KUBELET_VERSION" ) EOF +cat << EOF > pkg/interlink/version.go +package interlink + +var Version = "$KUBELET_VERSION" +EOF fi diff --git a/pkg/interlink/api/version.go b/pkg/interlink/api/version.go new file mode 100644 index 00000000..3a0f7fd3 --- /dev/null +++ b/pkg/interlink/api/version.go @@ -0,0 +1,24 @@ +package api + +import ( + "encoding/json" + "net/http" +) + +// VersionHandler reports the version of the running interLink server. +func VersionHandler(version string) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + w.Header().Set("Allow", http.MethodGet) + w.WriteHeader(http.StatusMethodNotAllowed) + return + } + + w.Header().Set("Content-Type", "application/json") + if err := json.NewEncoder(w).Encode(struct { + Version string `json:"version"` + }{Version: version}); err != nil { + return + } + } +} diff --git a/pkg/interlink/api/version_test.go b/pkg/interlink/api/version_test.go new file mode 100644 index 00000000..a34a413e --- /dev/null +++ b/pkg/interlink/api/version_test.go @@ -0,0 +1,30 @@ +package api + +import ( + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestVersionHandlerReturnsRunningVersion(t *testing.T) { + recorder := httptest.NewRecorder() + request := httptest.NewRequest(http.MethodGet, "/version", nil) + + VersionHandler("1.2.3").ServeHTTP(recorder, request) + + require.Equal(t, http.StatusOK, recorder.Code) + require.Equal(t, "application/json", recorder.Header().Get("Content-Type")) + require.JSONEq(t, `{"version":"1.2.3"}`, recorder.Body.String()) +} + +func TestVersionHandlerRejectsNonGetRequests(t *testing.T) { + recorder := httptest.NewRecorder() + request := httptest.NewRequest(http.MethodPost, "/version", nil) + + VersionHandler("1.2.3").ServeHTTP(recorder, request) + + require.Equal(t, http.StatusMethodNotAllowed, recorder.Code) + require.Equal(t, http.MethodGet, recorder.Header().Get("Allow")) +} diff --git a/pkg/interlink/version.go b/pkg/interlink/version.go new file mode 100644 index 00000000..39bd7636 --- /dev/null +++ b/pkg/interlink/version.go @@ -0,0 +1,4 @@ +package interlink + +// Version is the version of the running interLink server. +var Version = "test"