This is an automated email from the ASF dual-hosted git repository. dgrove pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/openwhisk-runtime-go.git
The following commit(s) were added to refs/heads/master by this push: new 80e36cd Drop support for golang 1.20 (#202) 80e36cd is described below commit 80e36cd797eba82e8b3187d88d98048cb2559f4e Author: David Grove <dgrove-...@users.noreply.github.com> AuthorDate: Fri Aug 23 09:56:48 2024 -0400 Drop support for golang 1.20 (#202) --- .github/workflows/ci.yaml | 2 - docs/BUILD.md | 2 +- go.mod | 2 +- golang1.20/Dockerfile | 52 -------- golang1.20/Makefile | 44 ------- golang1.20/bin/compile | 138 -------------------- golang1.20/build.gradle | 38 ------ golang1.20/lib/launcher.go | 141 --------------------- settings.gradle | 1 - .../ActionLoopBasicGo20Tests.scala | 31 ----- .../ActionLoopGo20ContainerTests.scala | 31 ----- 11 files changed, 2 insertions(+), 480 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index d5ca320..d88c4fe 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -90,8 +90,6 @@ jobs: SHORT_COMMIT=$(git rev-parse --short "$GITHUB_SHA") ./gradlew :actionloop:distDocker -PdockerRegistry=docker.io -PdockerImagePrefix=openwhisk -PdockerImageTag=nightly ./gradlew :actionloop:distDocker -PdockerRegistry=docker.io -PdockerImagePrefix=openwhisk -PdockerImageTag=$SHORT_COMMIT - ./gradlew :golang1.20:distDocker -PdockerRegistry=docker.io -PdockerImagePrefix=openwhisk -PdockerImageTag=nightly - ./gradlew :golang1.20:distDocker -PdockerRegistry=docker.io -PdockerImagePrefix=openwhisk -PdockerImageTag=$SHORT_COMMIT ./gradlew :golang1.21:distDocker -PdockerRegistry=docker.io -PdockerImagePrefix=openwhisk -PdockerImageTag=nightly ./gradlew :golang1.21:distDocker -PdockerRegistry=docker.io -PdockerImagePrefix=openwhisk -PdockerImageTag=$SHORT_COMMIT ./gradlew :golang1.22:distDocker -PdockerRegistry=docker.io -PdockerImagePrefix=openwhisk -PdockerImageTag=nightly diff --git a/docs/BUILD.md b/docs/BUILD.md index cdc6f91..f137408 100644 --- a/docs/BUILD.md +++ b/docs/BUILD.md @@ -43,9 +43,9 @@ To build the docker images, after compiling go proxy: This will build the images: -* `action-golang-v1.20`: an image supporting Go 1.20 sources (does expect an ack) * `action-golang-v1.21`: an image supporting Go 1.21 sources (does expect an ack) * `action-golang-v1.22`: an image supporting Go 1.22 sources (does expect an ack) +* `action-golang-v1.23`: an image supporting Go 1.23 sources (does expect an ack) * `actionloop-base`: the base image, supporting generic executables ans shell script (does not expect an ack) The `actionloop-base` image can be used for supporting other compiled programming languages as long as they implement a `compile` script and the *action loop* protocol described below. Please check [ENVVARS.md](ENVVARS.md) for configuration options diff --git a/go.mod b/go.mod index 18749f3..81490ef 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/apache/openwhisk-runtime-go -go 1.20 +go 1.21 require github.com/stretchr/testify v1.3.0 diff --git a/golang1.20/Dockerfile b/golang1.20/Dockerfile deleted file mode 100644 index b11e8d2..0000000 --- a/golang1.20/Dockerfile +++ /dev/null @@ -1,52 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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. -# - -# Do not fix the patch level for golang:1.20 to automatically get security fixes. -FROM golang:1.20-bullseye - -RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections &&\ - apt-get update &&\ - # Upgrade installed packages to get latest security fixes if the base image does not contain them already. - apt-get upgrade -y --no-install-recommends &&\ - apt-get install -y apt-utils &&\ - apt-get install -y \ - curl \ - jq \ - git \ - zip \ - vim && \ - apt-get -y install \ - librdkafka1 \ - librdkafka++1 &&\ - apt-get -y install \ - librdkafka-dev &&\ - # Cleanup apt data, we do not need them later on. - apt-get clean && rm -rf /var/lib/apt/lists/* &&\ - go install github.com/go-delve/delve/cmd/dlv@latest &&\ - mkdir /action -#make python 3 react as python -RUN ln -s /usr/bin/python3 /usr/bin/python - -WORKDIR /action -ADD proxy /bin/proxy -ADD bin/compile /bin/compile -ADD lib/launcher.go /lib/launcher.go -ENV OW_COMPILER=/bin/compile -ENV OW_LOG_INIT_ERROR=1 -ENV OW_WAIT_FOR_ACK=1 -ENV OW_EXECUTION_ENV=openwhisk/action-golang-v1.20 -ENTRYPOINT [ "/bin/proxy" ] diff --git a/golang1.20/Makefile b/golang1.20/Makefile deleted file mode 100644 index 147014e..0000000 --- a/golang1.20/Makefile +++ /dev/null @@ -1,44 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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. -# -IMG=action-golang-v1.20 - -build: - ../gradlew distDocker - -localbuild: - GOOS=linux GOARCH=amd64 go build -o proxy -a -ldflags '-extldflags "-static"' ../main/proxy.go - docker build -t $(IMG) . - docker tag $(IMG) whisk/$(IMG) - -push: build - docker tag $(IMG) actionloop/$(IMG) - docker push actionloop/$(IMG):nightly - -clean: - docker rmi -f whisk/$(IMG) actionloop/$(IMG) - -debug: build - docker run -p 8080:8080 \ - --name go-action --rm -ti --entrypoint=/bin/bash \ - -e OW_COMPILER=/mnt/bin/compile \ - -v $(PWD):/mnt whisk/$(IMG) - -enter: - docker exec -ti go-action bash - - -.PHONY: build push clean debug enter diff --git a/golang1.20/bin/compile b/golang1.20/bin/compile deleted file mode 100755 index c3f7ebe..0000000 --- a/golang1.20/bin/compile +++ /dev/null @@ -1,138 +0,0 @@ -#!/usr/bin/python -u -"""Golang Action Compiler -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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. -# -""" -from __future__ import print_function -import os, os.path, sys, re, shutil, subprocess, traceback, codecs -from os.path import dirname, exists -from time import sleep - -# write a file creating intermediate directories -def write_file(file, body, executable=False): - try: os.makedirs(dirname(file), mode=0o755) - except: pass - with open(file, mode="wb") as f: - f.write(body) - if executable: - os.chmod(file, 0o755) - -# copy a file eventually replacing a substring -def copy_replace(src, dst, match=None, replacement=""): - with open(src, 'rb') as s: - body = s.read() - if match: - body = body.replace(match, replacement) - write_file(dst, body) - - -def sources(launcher, source_dir, main): - func = main.capitalize() - has_main = None - - # copy the exec to exec.go - # also check if it has a main in it - src = "%s/exec" % source_dir - dst = "%s/exec__.go" % source_dir - if os.path.isfile(src): - with codecs.open(src, 'r', 'utf-8') as s: - with codecs.open(dst, 'w', 'utf-8') as d: - body = s.read() - has_main = re.match(r".*package\s+main\W.*func\s+main\s*\(\s*\)", body, flags=re.DOTALL) - d.write(body) - - # copy the launcher fixing the main - if not has_main: - dst = "%s/main__.go" % source_dir - if os.path.isdir("%s/main" % source_dir): - dst = "%s/main/main__.go" % source_dir - with codecs.open(dst, 'w', 'utf-8') as d: - with codecs.open(launcher, 'r', 'utf-8') as e: - code = e.read() - code = code.replace("Main", func) - d.write(code) - -def build(source_dir, target_dir): - # compile... - source_dir = os.path.abspath(source_dir) - parent = dirname(source_dir) - target = os.path.abspath("%s/exec" % target_dir) - if os.environ.get("__OW_EXECUTION_ENV"): - write_file("%s.env" % target, str.encode(os.environ["__OW_EXECUTION_ENV"])) - - env = { - "GOROOT": "/usr/local/go", - "GOPATH": "/home/go", - "PATH": os.environ["PATH"], - "GOCACHE": "/tmp", - "GO111MODULE": "on" - } - - gomod = "%s/go.mod" % source_dir - with open(os.devnull, "w") as dn: - if exists(gomod): - ret = subprocess.call(["go", "mod", "download"], cwd=source_dir, env=env, stderr=dn, stdout=dn) - if ret != 0: - print("cannot download modules") - return - else: - ret = subprocess.call(["go", "mod", "init", "exec"], cwd=source_dir, env=env, stdout=dn, stderr=dn) - if ret != 0: - print("cannot init modules") - return - - ldflags = "-s -w" - gobuild = ["go", "build", "-o", target, "-ldflags", ldflags] - if os.environ.get("__OW_EXECUTION_ENV"): - ldflags += " -X main.OwExecutionEnv=%s" % os.environ["__OW_EXECUTION_ENV"] - ret = subprocess.call(gobuild, cwd=source_dir, env=env) - if ret != 0: - print("failed", " ".join(gobuild), "\nin", source_dir, "\nenv", env) - -def debug(source_dir, target_dir, port): - source_dir = os.path.abspath(source_dir) - target = os.path.abspath("%s/exec" % target_dir) - if os.environ.get("__OW_EXECUTION_ENV"): - write_file("%s/exec.env" % source_dir, os.environ["__OW_EXECUTION_ENV"]) - shutil.rmtree(target_dir) - shutil.move(source_dir, target_dir) - write_file(target, """#!/bin/bash -cd "$(dirname $0)" -export GOCACHE=/tmp -export PATH=%s -exec script -q -c '/go/bin/dlv debug --headless --listen=127.0.0.1:%s --continue --accept-multiclient --log-dest /tmp/delve.log' -""" % (os.environ["PATH"], port) , True) - -def main(argv): - if len(argv) < 4: - print("usage: <main-file> <source-dir> <target-dir>") - sys.exit(1) - - main = argv[1] - source_dir = argv[2] - target_dir = argv[3] - launcher = dirname(dirname(argv[0]))+"/lib/launcher.go" - sources(launcher, source_dir, main) - - # if the debug port is present and not empty build with debug - if os.environ.get("__OW_DEBUG_PORT"): - debug(source_dir, target_dir, os.environ["__OW_DEBUG_PORT"]) - else: - build(source_dir, target_dir) - -if __name__ == '__main__': - main(sys.argv) diff --git a/golang1.20/build.gradle b/golang1.20/build.gradle deleted file mode 100644 index e001744..0000000 --- a/golang1.20/build.gradle +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ - -ext.dockerImageName = 'action-golang-v1.20' -apply from: '../gradle/docker.gradle' - -distDocker.dependsOn 'staticBuildProxy' -distDocker.finalizedBy('cleanup') - -task staticBuildProxy(type: Exec) { - environment CGO_ENABLED: "0" - environment GOOS: "linux" - environment GOARCH: "amd64" - environment GO111MODULE: "on" - - commandLine 'go', 'build', - '-o', 'proxy', '-a', - '-ldflags', '-extldflags "-static"', - '../main/proxy.go' -} - -task cleanup(type: Delete) { - delete 'proxy' -} diff --git a/golang1.20/lib/launcher.go b/golang1.20/lib/launcher.go deleted file mode 100644 index b432b88..0000000 --- a/golang1.20/lib/launcher.go +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package main - -import ( - "bufio" - "bytes" - "encoding/json" - "fmt" - "io" - "log" - "os" - "reflect" - "strings" -) - -// OwExecutionEnv is the execution environment set at compile time -var OwExecutionEnv = "" - -func main() { - // check if the execution environment is correct - if OwExecutionEnv != "" && OwExecutionEnv != os.Getenv("__OW_EXECUTION_ENV") { - fmt.Println("Execution Environment Mismatch") - fmt.Println("Expected: ", OwExecutionEnv) - fmt.Println("Actual: ", os.Getenv("__OW_EXECUTION_ENV")) - os.Exit(1) - } - - // debugging - var debug = os.Getenv("OW_DEBUG") != "" - if debug { - f, err := os.OpenFile("/tmp/action.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) - if err == nil { - log.SetOutput(f) - } - log.Printf("Environment: %v", os.Environ()) - } - - resultKind := reflect.TypeOf(Main).Out(0).Kind() - if resultKind != reflect.Map && resultKind != reflect.Slice && resultKind != reflect.Array { - fmt.Println("Support map and slice and array only") - os.Exit(1) - } - - // input - out := os.NewFile(3, "pipe") - defer out.Close() - reader := bufio.NewReader(os.Stdin) - - // acknowledgement of started action - fmt.Fprintf(out, `{ "ok": true}%s`, "\n") - if debug { - log.Println("action started") - } - - // read-eval-print loop - for { - // read one line - inbuf, err := reader.ReadBytes('\n') - if err != nil { - if err != io.EOF { - log.Println(err) - } - break - } - if debug { - log.Printf(">>>'%s'>>>", inbuf) - } - // parse one line - var input map[string]interface{} - err = json.Unmarshal(inbuf, &input) - if err != nil { - log.Println(err.Error()) - fmt.Fprintf(out, "{ error: %q}\n", err.Error()) - continue - } - if debug { - log.Printf("%v\n", input) - } - // set environment variables - for k, v := range input { - if k == "value" { - continue - } - if s, ok := v.(string); ok { - os.Setenv("__OW_"+strings.ToUpper(k), s) - } - } - // get payload if not empty - isJsonObjectParam := true - var payloadForJsonObject map[string]interface{} - var payloadForJsonArray []interface{} - if value, ok := input["value"].(map[string]interface{}); ok { - payloadForJsonObject = value - } else { - if value, ok := input["value"].([]interface{}); ok { - payloadForJsonArray = value - isJsonObjectParam = false - } - } - // process the request - var result interface{} - funcMain := reflect.ValueOf(Main) - if isJsonObjectParam { - param := []reflect.Value{reflect.ValueOf(payloadForJsonObject)} - reflectResult := funcMain.Call(param) - result = reflectResult[0].Interface() - } else { - param := []reflect.Value{reflect.ValueOf(payloadForJsonArray)} - reflectResult := funcMain.Call(param) - result = reflectResult[0].Interface() - } - // encode the answer - output, err := json.Marshal(&result) - if err != nil { - log.Println(err.Error()) - fmt.Fprintf(out, "{ error: %q}\n", err.Error()) - continue - } - output = bytes.Replace(output, []byte("\n"), []byte(""), -1) - if debug { - log.Printf("<<<'%s'<<<", output) - } - fmt.Fprintf(out, "%s\n", output) - } -} diff --git a/settings.gradle b/settings.gradle index fe55b89..fa5cd8e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -18,7 +18,6 @@ include 'tests' include 'actionloop' -include 'golang1.20' include 'golang1.21' include 'golang1.22' include 'golang1.23' diff --git a/tests/src/test/scala/runtime/actionContainers/ActionLoopBasicGo20Tests.scala b/tests/src/test/scala/runtime/actionContainers/ActionLoopBasicGo20Tests.scala deleted file mode 100644 index 7aebf47..0000000 --- a/tests/src/test/scala/runtime/actionContainers/ActionLoopBasicGo20Tests.scala +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package runtime.actionContainers - -import common.WskActorSystem -import org.junit.runner.RunWith -import org.scalatest.junit.JUnitRunner - -@RunWith(classOf[JUnitRunner]) -class ActionLoopBasicGo20Tests - extends ActionLoopBasicGoTests - with WskActorSystem { - - override lazy val goCompiler = "action-golang-v1.20" - override lazy val image = goCompiler - override lazy val requireAck = true -} diff --git a/tests/src/test/scala/runtime/actionContainers/ActionLoopGo20ContainerTests.scala b/tests/src/test/scala/runtime/actionContainers/ActionLoopGo20ContainerTests.scala deleted file mode 100644 index ce2ba9d..0000000 --- a/tests/src/test/scala/runtime/actionContainers/ActionLoopGo20ContainerTests.scala +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package runtime.actionContainers - -import common.WskActorSystem -import org.junit.runner.RunWith -import org.scalatest.junit.JUnitRunner -@RunWith(classOf[JUnitRunner]) -class ActionLoopGo20ContainerTests - extends ActionLoopGoContainerTests - with WskActorSystem { - - override lazy val goCompiler = "action-golang-v1.20" - override lazy val image = goCompiler - -}