diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml new file mode 100644 index 0000000..0c60981 --- /dev/null +++ b/.github/workflows/image.yml @@ -0,0 +1,68 @@ +# 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. +# +# Copyright 2021 Nuvolaris LLC +# +# 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. + +name: Build OpenServerless Streamer + +on: + push: + tags: + - '[0-9]*' + branches-ignore: + - '*' +jobs: + image: + name: Build OpenServerless Streamer Image + runs-on: ubuntu-latest + steps: + - name: Remove unnecessary files + run: | + sudo rm -rf /usr/share/dotnet + sudo rm -rf "$AGENT_TOOLSDIRECTORY" + - name: Checkout + uses: actions/checkout@v2 + with: + submodules: recursive + - name: License + uses: apache/skywalking-eyes@main + - name: Assign TAG from pull request + if: ${{ github.event_name == 'pull_request' }} + run: | + echo "IMG_TAG=$(git rev-parse --short HEAD)" >> "$GITHUB_ENV" + - name: Assign TAG from push + if: ${{ github.event_name != 'pull_request' }} + run: | + echo "IMG_TAG=$(git describe --tags --abbrev=0)" >> "$GITHUB_ENV" + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Image + run: task buildx-and-push TAG="$IMG_TAG" \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..064a9fa --- /dev/null +++ b/.gitignore @@ -0,0 +1,100 @@ +# 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. + +# Mac +.DS_Store + +# goenv +.go-version + +# Gradle +.gradle/ +.gogradle/ +*.log +tests/build/ +test.out + +# Dependencies +vendor/ +virtulenv/ +node_modules/ + +# Go binary proxy +proxy +proxy-experimental +actionloop/proxy +golang1.19/proxy +golang1.20/proxy +golang1.21/proxy +golang1.22/proxy + +# Go test transient files +openwhisk/_test/exec +openwhisk/_test/exec.go +openwhisk/_test/hi +openwhisk/_test/hello_greeting +openwhisk/_test/hello_message +openwhisk/_test/*.zip +openwhisk/_test/*.jar +openwhisk/_test/compile/ +openwhisk/_test/output/ +openwhisk/_test/venv/ +openwhisk/action/ +openwhisk/compile/ +openwhisk/debug.test +*.pyc +*.env + +# Eclipse +tests/bin/ +**/.project +.settings/ +.classpath +.cache-main +.cache-tests + +# IntelliJ +.idea +*.class +*.iml +tests/out/ + +# VSCode +.vscode + +# examples +exec +*.done +*.zip +*_launcher_.go +test.json +pkg/ + +# etc +.git-hooks/ +.vscode/ +.task +.env +.env +.env.nuv +.env.src +.param.json + +openserverless-runtimes + +runtimes.json +action/**/* diff --git a/.licenserc.yaml b/.licenserc.yaml new file mode 100644 index 0000000..ea81980 --- /dev/null +++ b/.licenserc.yaml @@ -0,0 +1,49 @@ +# 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. +# +header: + license: + spdx-id: Apache-2.0 + copyright-owner: Apache Software Foundation + + paths-ignore: + - '**/*.sample' + - 'env.src' + - '.git-hooks/pre-commit' + - '**/_*' + - 'nuvroot.json' + - 'LICENSE' + - 'NOTICE' + - 'DISCLAIMER' + - 'cert-manager.yaml' + - 'ingress-deploy.yaml' + - 'runtimes.json' + - '**/*.json' + - '**/*.service' + - 'update/update.ps1' + - '**/mime.types' + - '**/*.txt' + - '.env.src' + - 'go.sum' + - 'go.mod' + - 'openwhisk/_test/**' + - '.gitattributes' + - '.env.dist' + - '**/.npmrc' + - 'customkitd.toml' + - 'runtimes.json' + - 'runtimes.json.tpl' diff --git a/DISCLAIMER b/DISCLAIMER new file mode 100644 index 0000000..b505beb --- /dev/null +++ b/DISCLAIMER @@ -0,0 +1,11 @@ +Apache OpenServerless (Incubating) is an effort undergoing incubation at the Apache +Software Foundation (ASF), sponsored by the Apache Incubator PMC. + +Incubation is required of all newly accepted projects until a further review +indicates that the infrastructure, communications, and decision making process +have stabilized in a manner consistent with other successful ASF projects. + +While incubation status is not necessarily a reflection of the completeness +or stability of the code, it does indicate that the project has yet to be +fully endorsed by the ASF. + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..3c12889 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,25 @@ +# 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.23 to automatically get security fixes. +FROM golang:1.23 AS builder +ADD src /src +WORKDIR /src +RUN go build -o /bin/streamer + +FROM golang:1.23 +COPY --from=builder /bin/streamer /streamer +CMD ["/streamer"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..dc2c22e --- /dev/null +++ b/LICENSE @@ -0,0 +1,218 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + + +======================================================================== +Apache License 2.0 +======================================================================== + +This distribution bundles the following components, which are available under an Apache License 2.0 (https://opensource.org/licenses/Apache-2.0). +Spray Caching 1.3.4 (io.spray:spray-caching_2.11:1.3.4 - http://spray.io/documentation/1.2.4/spray-caching/) + ConcurrentMapBackedCache.scala under common/scala/src/main/scala/org/apache/openwhisk/core/database/ contains implementation + from Spray's [[spray.caching.Cache]] and [[spray.caching.SimpleLruCache]] respectively. + License included at licenses/LICENSE-spray.txt, or https://github.com/spray/spray/blob/master/LICENSE + Copyright (C) 2011-2015 the spray project + +This product bundles the files gradlew and gradlew.bat from Gradle v5.5 +which are distributed under the Apache License, Version 2.0. +For details see ./gradlew and ./gradlew.bat. \ No newline at end of file diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..9b09468 --- /dev/null +++ b/NOTICE @@ -0,0 +1,6 @@ +Apache OpenServerless (Incubating) +Copyright 2024 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + diff --git a/README.md b/README.md index 9736574..aba05cd 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,25 @@ -# openserverless-streamer + -The openserverless streamer is a tool to relay a stream from OpenWhisk actions to an outside +# Apache OpenServerless Streamer (incubating) + +The OpenServerless streamer is a tool to relay a stream from OpenWhisk actions to an outside HTTP client. The streamer is a simple HTTP server that exposes an endpoint /stream/{namespace}/{action} to diff --git a/Taskfile.yml b/Taskfile.yml new file mode 100644 index 0000000..f0ff2f2 --- /dev/null +++ b/Taskfile.yml @@ -0,0 +1,48 @@ +# 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. +version: "3" + +vars: + BASEIMG: ghcr.io/nuvolaris/openserverless-streamer + COMMIT_ID: + sh: git rev-parse --short HEAD + TAG: + sh: git describe --tags --abbrev=0 2>/dev/null || echo latest + + +tasks: + + image-tag: + silent: true + cmds: + - git tag -d $(git tag) + - git tag -f $(date +%y%m%d%H%M) + - env PAGER= git tag + + build: + cmds: + - | + IMG="{{.BASEIMG}}:{{.TAG}}" + if test -n "{{.PUSH}}" + then {{.DRY}} docker buildx build -t $IMG --platform linux/amd64,linux/arm64 . --push + else {{.DRY}} docker buildx build -t $IMG . --load + fi + + buildx-and-push: + - | + IMG="{{.BASEIMG}}:{{.TAG}}" + docker buildx build --platform linux/amd64,linux/arm64 -t $IMG . --push \ No newline at end of file diff --git a/main.go b/main.go deleted file mode 100644 index 9510236..0000000 --- a/main.go +++ /dev/null @@ -1,17 +0,0 @@ -package main - -import "os" - -func main() { - owApihost := os.Getenv("OW_APIHOST") - if owApihost == "" { - panic("OW_APIHOST is not set") - } - - streamerAddr := os.Getenv("STREAMER_ADDR") - if streamerAddr == "" { - panic("STREAMER_ADDR is not set") - } - - startHTTPServer(streamerAddr, owApihost) -} diff --git a/ow.go b/ow.go deleted file mode 100644 index a2f992c..0000000 --- a/ow.go +++ /dev/null @@ -1,22 +0,0 @@ -package main - -import ( - "net/http" - - "github.com/apache/openwhisk-client-go/whisk" -) - -func NewOpenWhiskClient(apiHost string, apiKey string, namespace string) *whisk.Client { - client, err := whisk.NewClient(http.DefaultClient, - &whisk.Config{ - Host: apiHost, - Namespace: namespace, - AuthToken: apiKey, - }) - - if err != nil { - panic(err) - } - - return client -} diff --git a/go.mod b/src/go.mod similarity index 100% rename from go.mod rename to src/go.mod diff --git a/go.sum b/src/go.sum similarity index 100% rename from go.sum rename to src/go.sum diff --git a/httpserver.go b/src/httpserver.go similarity index 82% rename from httpserver.go rename to src/httpserver.go index 8efe601..a1e2e3d 100644 --- a/httpserver.go +++ b/src/httpserver.go @@ -1,3 +1,20 @@ +// 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 ( diff --git a/src/main.go b/src/main.go new file mode 100644 index 0000000..188b2d8 --- /dev/null +++ b/src/main.go @@ -0,0 +1,34 @@ +// 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 "os" + +func main() { + owApihost := os.Getenv("OW_APIHOST") + if owApihost == "" { + panic("OW_APIHOST is not set") + } + + streamerAddr := os.Getenv("STREAMER_ADDR") + if streamerAddr == "" { + panic("STREAMER_ADDR is not set") + } + + startHTTPServer(streamerAddr, owApihost) +} diff --git a/src/ow.go b/src/ow.go new file mode 100644 index 0000000..0be5876 --- /dev/null +++ b/src/ow.go @@ -0,0 +1,39 @@ +// 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 ( + "net/http" + + "github.com/apache/openwhisk-client-go/whisk" +) + +func NewOpenWhiskClient(apiHost string, apiKey string, namespace string) *whisk.Client { + client, err := whisk.NewClient(http.DefaultClient, + &whisk.Config{ + Host: apiHost, + Namespace: namespace, + AuthToken: apiKey, + }) + + if err != nil { + panic(err) + } + + return client +} diff --git a/tcpserver.go b/src/tcpserver.go similarity index 71% rename from tcpserver.go rename to src/tcpserver.go index 063b3e2..97eb89a 100644 --- a/tcpserver.go +++ b/src/tcpserver.go @@ -1,3 +1,20 @@ +// 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 ( diff --git a/tcpserver_test.go b/src/tcpserver_test.go similarity index 70% rename from tcpserver_test.go rename to src/tcpserver_test.go index 43f3be3..1268e08 100644 --- a/tcpserver_test.go +++ b/src/tcpserver_test.go @@ -1,3 +1,20 @@ +// 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 (