Update krew with login option (#491)

Signed-off-by: chenliu1993 <cl2037829916@gmail.com>
This commit is contained in:
chenliu1993
2023-03-12 01:29:55 +09:00
committed by GitHub
parent cd7194a508
commit aa26ed2b96
20 changed files with 464 additions and 205 deletions
+1
View File
@@ -364,6 +364,7 @@ krew/bilipro
krew/cmd/kubectl-bilipro
krew/kustomization.yaml
bilipro
krew/pkg/utils/fixtures
kustomization.yaml
# cookie config
+10 -1
View File
@@ -24,6 +24,7 @@ deploy: build install #### build + install
build: #### build the plugin
@go vet ./... && \
go fmt ./... && \
echo "build on ${GOOS}/${GOARCH}" && \
cd ${ROOT_DIR}/krew/cmd && \
GOOS=${GOOS} GOARCH=${GOARCH} CGO_ENABLED=0 go build -ldflags "-X github.com/RayWangQvQ/BiliBiliToolPro/krew/pkg/cmd.Version=${GITCOMMIT}" -o $(BIN_NAME) kubectl-bilipro.go
@@ -31,4 +32,12 @@ build: #### build the plugin
.PHONY: install
install: #### install the plugin
@cd ${ROOT_DIR}/krew/cmd && \
sudo install ./$(BIN_NAME) ${KUBECTL_DIR}/$(BIN_NAME)
sudo install ./$(BIN_NAME) ${KUBECTL_DIR}/$(BIN_NAME)
.PHONY: test
test: #### run tests
@cd ${ROOT_DIR}/krew/pkg/utils && \
rm -rf fixtures && \
mkdir fixtures && \
go test ./... -cover && \
rm -rf fixtures
+7 -7
View File
@@ -10,7 +10,7 @@
## Install Plugin
Command: `cd ./krew && make deploy`
The binary will be generated in cmd/ install it alonside the kubectl binary.
The binary will be generated in cmd/ install it alonside the kubectl binary.
For example: the kubectl is installed under `/usr/bin`, then put the bilibilipro plugin under `/usr/bin` too.
@@ -18,14 +18,13 @@ For example: the kubectl is installed under `/usr/bin`, then put the bilibilipro
### Deployment && Update
Command: `kubectl bilipro init --config config.yaml`
Creates Deployment with the needed environments.
Command: `kubectl bilipro init --config config.yaml [optional]--login`
Creates Deployment with the needed environments.
Optional Options:
- `--image=zai7lou/bilibili_tool_pro:0.2.1`
- `--image=zai7lou/bilibili_tool_pro:1.0.1`
- `--namespace=bilipro`
- `--image-pull-secret=`
@@ -36,6 +35,7 @@ Required Options:
The content of <config.yaml> is a yaml array, please refer to the example config yaml under the krew directory.
For example
````yaml
- name: Ray_BiliBiliCookies__2
value: "cookie"
@@ -44,10 +44,8 @@ For example
value: "11 11 * * *"
````
Suggestions: Deploy this workload in namespace other than default or kube-* namespace, because the delete logic should be improved
### Deletion
Command: `kubectl bilipro delete [options]`
@@ -65,4 +63,6 @@ Command: `kubectl bilipro version`
Output the plugin version.
## Package
Pls refer to [installation](https://krew.sigs.k8s.io/docs), you can package your own krew plugin
+3
View File
@@ -6,7 +6,9 @@ import (
"github.com/spf13/pflag"
"github.com/RayWangQvQ/BiliBiliToolPro/krew/pkg/cmd"
helper "github.com/RayWangQvQ/BiliBiliToolPro/krew/pkg/utils"
"k8s.io/cli-runtime/pkg/genericclioptions"
"k8s.io/klog/v2"
)
func main() {
@@ -15,6 +17,7 @@ func main() {
cmd := cmd.NewExecutor(genericclioptions.IOStreams{In: os.Stdin, Out: os.Stdout, ErrOut: os.Stderr})
if err := cmd.Execute(); err != nil {
klog.Error(helper.GenErrorMsg(helper.SERVER_ERROR, err.Error()).Error())
os.Exit(1)
}
}
+1 -1
View File
@@ -1,4 +1,4 @@
- name: Ray_BiliBiliCookies__2
- name: Ray_BiliBiliCookies__1
value: "cookie"
# DailyTrigger - required
- name: Ray_DailyTaskConfig__Cron
+16 -17
View File
@@ -1,33 +1,34 @@
module github.com/RayWangQvQ/BiliBiliToolPro/krew
go 1.18
go 1.20
require (
github.com/spf13/cobra v1.4.0
github.com/spf13/pflag v1.0.5
k8s.io/api v0.25.4
k8s.io/apimachinery v0.25.4
k8s.io/cli-runtime v0.25.4
k8s.io/klog/v2 v2.70.1
k8s.io/client-go v0.25.4
k8s.io/klog/v2 v2.80.1
sigs.k8s.io/kustomize/api v0.12.1
sigs.k8s.io/kustomize/kyaml v0.13.9
sigs.k8s.io/yaml v1.2.0
sigs.k8s.io/yaml v1.3.0
)
require (
github.com/PuerkitoBio/purell v1.1.1 // indirect
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/emicklei/go-restful/v3 v3.8.0 // indirect
github.com/emicklei/go-restful/v3 v3.9.0 // indirect
github.com/evanphx/json-patch v4.12.0+incompatible // indirect
github.com/go-errors/errors v1.0.1 // indirect
github.com/go-logr/logr v1.2.3 // indirect
github.com/go-openapi/jsonpointer v0.19.5 // indirect
github.com/go-openapi/jsonreference v0.19.5 // indirect
github.com/go-openapi/jsonreference v0.20.0 // indirect
github.com/go-openapi/swag v0.19.14 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/google/btree v1.0.1 // indirect
github.com/google/gnostic v0.5.7-v3refs // indirect
github.com/google/go-cmp v0.5.9 // indirect
github.com/google/gofuzz v1.1.0 // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
github.com/google/uuid v1.1.2 // indirect
@@ -46,21 +47,19 @@ require (
github.com/pkg/errors v0.9.1 // indirect
github.com/xlab/treeprint v1.1.0 // indirect
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect
golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f // indirect
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
golang.org/x/text v0.3.7 // indirect
golang.org/x/net v0.7.0 // indirect
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b // indirect
golang.org/x/sys v0.5.0 // indirect
golang.org/x/term v0.5.0 // indirect
golang.org/x/text v0.7.0 // indirect
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/protobuf v1.28.0 // indirect
google.golang.org/protobuf v1.28.1 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/apimachinery v0.25.4 // indirect
k8s.io/client-go v0.25.4 // indirect
k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 // indirect
k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed // indirect
k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 // indirect
k8s.io/utils v0.0.0-20221107191617-1a15be271d1d // indirect
sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
)
+31 -31
View File
@@ -33,10 +33,6 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
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/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
@@ -49,8 +45,8 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
github.com/emicklei/go-restful/v3 v3.8.0 h1:eCZ8ulSerjdAiaNpF7GxXIE7ZCMo1moN1qX+S609eVw=
github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE=
github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
@@ -62,15 +58,14 @@ github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=
github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM=
github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg=
github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA=
github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo=
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng=
github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
@@ -117,7 +112,8 @@ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=
github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
@@ -177,6 +173,8 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/onsi/ginkgo/v2 v2.1.6 h1:Fx2POJZfKRQcM1pH49qSZiYeu319wji004qX+GDovrU=
github.com/onsi/gomega v1.20.1 h1:PA/3qinGoukvymdIDV8pii6tiZgC8kbmJO6Z5+b002Q=
github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI=
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -187,7 +185,6 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q=
github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
@@ -261,7 +258,6 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@@ -277,15 +273,16 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg=
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg=
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -322,17 +319,21 @@ golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -462,8 +463,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -495,13 +496,12 @@ k8s.io/cli-runtime v0.25.4 h1:GTSBN7aKBrc2LqpdO30CmHQqJtRmotxV7XsMSP+QZIk=
k8s.io/cli-runtime v0.25.4/go.mod h1:JGOw1CR8v4Mcz6cEKA7bFQe0bPrNn1l5sGAX1/Ke4Eg=
k8s.io/client-go v0.25.4 h1:3RNRDffAkNU56M/a7gUfXaEzdhZlYhoW8dgViGy5fn8=
k8s.io/client-go v0.25.4/go.mod h1:8trHCAC83XKY0wsBIpbirZU4NTUpbuhc2JnI7OruGZw=
k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
k8s.io/klog/v2 v2.70.1 h1:7aaoSdahviPmR+XkS7FyxlkkXs6tHISSG03RxleQAVQ=
k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 h1:MQ8BAZPZlWk3S9K4a9NCkIFQtZShWqoha7snGixVgEA=
k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1/go.mod h1:C/N6wCaBHeBHkHUesQOQy2/MZqGgMAFPqGsGQLdbZBU=
k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed h1:jAne/RjBTyawwAy0utX5eqigAwz/lQhTmy+Hr/Cpue4=
k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4=
k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E=
k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4=
k8s.io/utils v0.0.0-20221107191617-1a15be271d1d h1:0Smp/HP1OH4Rvhe+4B8nWGERtlqAGSftbSbbmm45oFs=
k8s.io/utils v0.0.0-20221107191617-1a15be271d1d/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
@@ -513,5 +513,5 @@ sigs.k8s.io/kustomize/kyaml v0.13.9 h1:Qz53EAaFFANyNgyOEJbT/yoIHygK40/ZcvU3rgry2
sigs.k8s.io/kustomize/kyaml v0.13.9/go.mod h1:QsRbD0/KcU+wdk0/L0fIp2KLnohkVzs6fQ85/nOXac4=
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=
sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E=
sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
+18 -53
View File
@@ -1,10 +1,7 @@
package cmd
import (
"bufio"
"fmt"
"io"
"os"
"os/exec"
"strings"
@@ -15,7 +12,7 @@ import (
"k8s.io/klog/v2"
"github.com/RayWangQvQ/BiliBiliToolPro/krew/pkg/options"
"github.com/RayWangQvQ/BiliBiliToolPro/krew/pkg/utils"
helper "github.com/RayWangQvQ/BiliBiliToolPro/krew/pkg/utils"
"github.com/spf13/cobra"
)
@@ -45,7 +42,7 @@ func newDeleteCmd(out io.Writer, errOut io.Writer) *cobra.Command {
err := o.run(out)
if err != nil {
klog.Warning(err)
klog.Error(err)
return err
}
return nil
@@ -59,19 +56,13 @@ func newDeleteCmd(out io.Writer, errOut io.Writer) *cobra.Command {
}
func (o *deleteCmd) run(writer io.Writer) error {
inDiskSys, err := utils.GetResourceFileSys()
inDiskSys, err := helper.GetResourceFileSys()
if err != nil {
klog.Error(err)
return err
}
// if the bilibili tool is deployed under system/pre-defined namespace, ignore the namespace file
resources := []string{}
if o.deployOpts.Namespace == "default" || o.deployOpts.Namespace == "kube-system" || o.deployOpts.Namespace == "kube-public" {
resources = []string{"bilipro/bilibiliPro"}
} else {
resources = []string{"bilipro/bilibiliPro", "bilipro/ns"}
}
// remove namespace files lastly
resources := []string{"base/bilibiliPro/deployment.yaml"}
// write the kustomization file
@@ -90,20 +81,17 @@ func (o *deleteCmd) run(writer io.Writer) error {
// Compile the kustomization to a file and create on the in memory filesystem
kustYaml, err := yaml.Marshal(kustomizationYaml)
if err != nil {
klog.Error(err)
return err
return helper.GenErrorMsg(helper.TEMPLATE_ERROR, err.Error())
}
kustFile, err := inDiskSys.Create("kustomization.yaml")
kustFile, err := inDiskSys.Create("./bilipro/kustomization.yaml")
if err != nil {
klog.Error(err)
return err
return helper.GenErrorMsg(helper.TEMPLATE_ERROR, err.Error())
}
_, err = kustFile.Write(kustYaml)
if err != nil {
klog.Error(err)
return err
return helper.GenErrorMsg(helper.TEMPLATE_ERROR, err.Error())
}
// kustomize build the target location
@@ -113,53 +101,30 @@ func (o *deleteCmd) run(writer io.Writer) error {
m, err := k.Run(inDiskSys, "./bilipro")
if err != nil {
klog.Error(err)
return err
return helper.GenErrorMsg(helper.TEMPLATE_ERROR, err.Error())
}
yml, err := m.AsYaml()
if err != nil {
klog.Error(err)
return err
return helper.GenErrorMsg(helper.TEMPLATE_ERROR, err.Error())
}
if o.output {
_, err = writer.Write(yml)
klog.Error(err)
return err
return helper.GenErrorMsg(helper.TEMPLATE_ERROR, err.Error())
}
// do kubectl delete
cmd := exec.Command("kubectl", "delete", "-f", "-")
cmd.Stdin = strings.NewReader(string(yml))
stdoutReader, _ := cmd.StdoutPipe()
stdoutScanner := bufio.NewScanner(stdoutReader)
go func() {
for stdoutScanner.Scan() {
fmt.Println(stdoutScanner.Text())
}
}()
stderrReader, _ := cmd.StderrPipe()
stderrScanner := bufio.NewScanner(stderrReader)
go func() {
for stderrScanner.Scan() {
fmt.Println(stderrScanner.Text())
}
}()
err = cmd.Start()
if err != nil {
fmt.Printf("Error : %v \n", err)
os.Exit(1)
if err := helper.Run(cmd, strings.NewReader(string(yml))); err != nil {
return err
}
// stuck here to wait for the completion
err = cmd.Wait()
if err != nil {
fmt.Printf("Error: %v \n", err)
os.Exit(1)
// delete the namespace
cmd = exec.Command("kubectl", "delete", "ns", o.deployOpts.Namespace)
if err := helper.Run(cmd, nil); err != nil {
return err
}
return nil
}
+4 -30
View File
@@ -1,15 +1,13 @@
package cmd
import (
"bufio"
"fmt"
"io"
"os"
"os/exec"
"k8s.io/klog/v2"
"github.com/RayWangQvQ/BiliBiliToolPro/krew/pkg/options"
helper "github.com/RayWangQvQ/BiliBiliToolPro/krew/pkg/utils"
"github.com/spf13/cobra"
)
@@ -39,7 +37,7 @@ func newGetCmd(out io.Writer, errOut io.Writer) *cobra.Command {
err := o.run(out)
if err != nil {
klog.Warning(err)
klog.Error(err)
return err
}
return nil
@@ -56,32 +54,8 @@ func (o *getCmd) run(writer io.Writer) error {
// do kubectl get
cmd := exec.Command("kubectl", "get", "deploy", o.deployOpts.Name, "-n", o.deployOpts.Namespace)
stdoutReader, _ := cmd.StdoutPipe()
stdoutScanner := bufio.NewScanner(stdoutReader)
go func() {
for stdoutScanner.Scan() {
fmt.Println(stdoutScanner.Text())
}
}()
stderrReader, _ := cmd.StderrPipe()
stderrScanner := bufio.NewScanner(stderrReader)
go func() {
for stderrScanner.Scan() {
fmt.Println(stderrScanner.Text())
}
}()
err := cmd.Start()
if err != nil {
fmt.Printf("Error : %v \n", err)
os.Exit(1)
}
// stuck here to wait for the completion
err = cmd.Wait()
if err != nil {
fmt.Printf("Error: %v \n", err)
os.Exit(1)
if err := helper.Run(cmd, nil); err != nil {
return err
}
return nil
+58 -52
View File
@@ -1,14 +1,13 @@
package cmd
import (
"bufio"
"encoding/json"
"fmt"
"io"
"io/ioutil"
"os"
"os/exec"
"strings"
"time"
corev1 "k8s.io/api/core/v1"
@@ -23,7 +22,7 @@ import (
"github.com/spf13/cobra"
"github.com/RayWangQvQ/BiliBiliToolPro/krew/pkg/options"
"github.com/RayWangQvQ/BiliBiliToolPro/krew/pkg/utils"
helper "github.com/RayWangQvQ/BiliBiliToolPro/krew/pkg/utils"
"sigs.k8s.io/kustomize/api/krusty"
)
@@ -37,6 +36,7 @@ type initCmd struct {
out io.Writer
errOut io.Writer
output bool
login bool
deployOpts options.DeployOptions
}
@@ -52,7 +52,7 @@ func newInitCmd(out io.Writer, errOut io.Writer) *cobra.Command {
RunE: func(cmd *cobra.Command, args []string) error {
err := o.run(out)
if err != nil {
klog.Warning(err)
klog.Error(err)
return err
}
return nil
@@ -60,11 +60,12 @@ func newInitCmd(out io.Writer, errOut io.Writer) *cobra.Command {
}
f := cmd.Flags()
f.StringVarP(&o.deployOpts.Image, "image", "i", "zai7lou/bilibili_tool_pro:0.2.1", "bilibilipro image")
f.StringVarP(&o.deployOpts.Image, "image", "i", "zai7lou/bilibili_tool_pro:1.0.1", "bilibilipro image")
f.StringVarP(&o.deployOpts.Namespace, "namespace", "n", "bilipro", "namespace scope for this request")
f.StringVar(&o.deployOpts.ImagePullSecret, "image-pull-secret", "", "image pull secret to be used for pulling bilibilipro image")
f.StringVarP(&o.deployOpts.ConfigFilePath, "config", "c", "", "the config file contanis the environment variables")
f.BoolVarP(&o.output, "output", "o", false, "dry run this command and generate requisite yaml")
f.BoolVarP(&o.login, "login", "l", false, "scan QR login code")
return cmd
}
@@ -87,17 +88,18 @@ type normalEnvVars struct {
// run initializes local config and installs BiliBiliPro tool to Kubernetes Cluster.
func (o *initCmd) run(writer io.Writer) error {
inDiskSys, err := utils.GetResourceFileSys()
inDiskSys, err := helper.GetResourceFileSys()
if err != nil {
return err
}
// TODO: All about paths are a little bit tricky should give it more thoughts
// if the bilibili tool is deployed under system/pre-defined namespace, ignore the namespace file
resources := []string{}
var resources []string // nolint: go-staticcheck
if o.deployOpts.Namespace == "default" || o.deployOpts.Namespace == "kube-system" || o.deployOpts.Namespace == "kube-public" {
resources = []string{"bilipro/bilibiliPro"}
resources = []string{"base/bilibiliPro/deployment.yaml"}
} else {
resources = []string{"bilipro/ns", "bilipro/bilibiliPro"}
resources = []string{"base/ns/namespace.yaml", "base/bilibiliPro/deployment.yaml"}
}
// write the kustomization file
@@ -120,17 +122,15 @@ func (o *initCmd) run(writer io.Writer) error {
})
}
// create patches for the env
content, err := ioutil.ReadFile(o.deployOpts.ConfigFilePath)
content, err := os.ReadFile(o.deployOpts.ConfigFilePath)
if err != nil {
klog.Error(err)
return err
return helper.GenErrorMsg(helper.FILE_ERROR, err.Error())
}
envs := []normalEnvVars{}
err = yaml.Unmarshal(content, &envs)
if err != nil {
klog.Error(err)
return err
return helper.GenErrorMsg(helper.TEMPLATE_ERROR, err.Error())
}
deployDepPatches = append(deployDepPatches, opInterface{
@@ -158,7 +158,8 @@ func (o *initCmd) run(writer io.Writer) error {
Version: "v1",
Kind: "Deployment",
},
Name: "bilibilipro",
Name: "bilibilipro",
Namespace: o.deployOpts.Namespace,
},
},
})
@@ -175,20 +176,17 @@ func (o *initCmd) run(writer io.Writer) error {
// Compile the kustomization to a file and create on the in memory filesystem
kustYaml, err := yaml.Marshal(kustomizationYaml)
if err != nil {
klog.Error(err)
return err
}
kustFile, err := inDiskSys.Create("kustomization.yaml")
kustFile, err := inDiskSys.Create("./bilipro/kustomization.yaml")
if err != nil {
klog.Error(err)
return err
return helper.GenErrorMsg(helper.TEMPLATE_ERROR, err.Error())
}
_, err = kustFile.Write(kustYaml)
if err != nil {
klog.Error(err)
return err
return helper.GenErrorMsg(helper.TEMPLATE_ERROR, err.Error())
}
// kustomize build the target location
@@ -198,52 +196,60 @@ func (o *initCmd) run(writer io.Writer) error {
m, err := k.Run(inDiskSys, "./bilipro")
if err != nil {
klog.Error(err)
return err
return helper.GenErrorMsg(helper.TEMPLATE_ERROR, err.Error())
}
yml, err := m.AsYaml()
if err != nil {
klog.Error(err)
return err
return helper.GenErrorMsg(helper.TEMPLATE_ERROR, err.Error())
}
if o.output {
_, err = writer.Write(yml)
klog.Error(err)
return err
if err != nil {
return helper.GenErrorMsg(helper.TEMPLATE_ERROR, err.Error())
}
}
// do kubectl apply
// make sure kubectl is under your PATH
cmd := exec.Command("kubectl", "apply", "-f", "-")
cmd.Stdin = strings.NewReader(string(yml))
stdoutReader, _ := cmd.StdoutPipe()
stdoutScanner := bufio.NewScanner(stdoutReader)
go func() {
for stdoutScanner.Scan() {
fmt.Println(stdoutScanner.Text())
}
}()
stderrReader, _ := cmd.StderrPipe()
stderrScanner := bufio.NewScanner(stderrReader)
go func() {
for stderrScanner.Scan() {
fmt.Println(stderrScanner.Text())
}
}()
err = cmd.Start()
if err != nil {
fmt.Printf("Error : %v \n", err)
os.Exit(1)
if err := helper.Run(cmd, strings.NewReader(string(yml))); err != nil {
return err
}
// Stuck here until there are out and err
err = cmd.Wait()
if err != nil {
fmt.Printf("Error: %v \n", err)
os.Exit(1)
// if there is login required
if o.login {
client, _, err := helper.GetK8sClient()
if err != nil {
return err
}
// get the pod name
podName, err := helper.GetBiliName(client, o.deployOpts.Namespace, "bilibilipro")
if err != nil {
return err
}
// TODO: Stupid way, just sleep to wait container is ready, maybe a watch is a better option
time.Sleep(15 * time.Second)
args := []string{
"exec",
podName,
"-n",
o.deployOpts.Namespace,
"--",
"dotnet",
"Ray.BiliBiliTool.Console.dll",
"--runTasks=Login",
}
cmd := exec.Command("kubectl", args...)
if err := helper.Run(cmd, nil); err != nil {
return err
}
}
return nil
+1 -1
View File
@@ -35,7 +35,7 @@ func newVersionCmd(out io.Writer, errOut io.Writer) *cobra.Command {
RunE: func(cmd *cobra.Command, args []string) error {
err := o.run()
if err != nil {
klog.Warning(err)
klog.Error(err)
return err
}
return nil
@@ -13,6 +13,14 @@ spec:
spec:
containers:
- name: bilibilipro
image: zai7lou/bilibili_tool_pro:0.2.1
image: zai7lou/bilibili_tool_pro:1.0.1
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: 80m
memory: 100M
limits:
cpu: 100m
memory: 120M
+71
View File
@@ -0,0 +1,71 @@
package utils
import (
"context"
"fmt"
"os"
"path/filepath"
"time"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
)
func GetK8sClient() (*kubernetes.Clientset, *rest.Config, error) {
var kubeconfig string
envKubeConfig := os.Getenv("KUBECONFIG")
if envKubeConfig == "" {
home, err := os.UserHomeDir()
if err != nil {
return nil, nil, GenErrorMsg(SERVER_ERROR, err.Error())
}
kubeconfig = filepath.Join(home, ".kube", "config")
} else {
kubeconfig = envKubeConfig
}
// use the current context in kubeconfig
config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
if err != nil {
return nil, nil, GenErrorMsg(SERVER_ERROR, err.Error())
}
// create the clientset
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
return nil, config, GenErrorMsg(SERVER_ERROR, err.Error())
}
return clientset, config, nil
}
func GetBiliName(client *kubernetes.Clientset, namespace, deploymentName string) (string, error) {
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Minute)
defer cancel()
deployment, err := client.AppsV1().Deployments(namespace).Get(ctx, deploymentName, metav1.GetOptions{})
if err != nil {
return "", GenErrorMsg(SERVER_ERROR, err.Error())
}
// we dont do much checks here
selector := deployment.Spec.Selector.MatchLabels
if len(selector) == 0 {
return "", GenErrorMsg(SERVER_ERROR, "deployment doesn't have any selectors, please check the deploy template")
}
listOptions := metav1.ListOptions{
LabelSelector: labels.Set(selector).String(),
}
pods, err := client.CoreV1().Pods(namespace).List(ctx, listOptions)
if err != nil {
return "", GenErrorMsg(SERVER_ERROR, "cannot list the pods with deploy selectors")
}
if len(pods.Items) != 1 {
return "", GenErrorMsg(SERVER_ERROR, fmt.Sprintf("pod number is expected to be 1, currently %d", len(pods.Items)))
}
// only one pod is supposed to be existing, soft constraint
return pods.Items[0].ObjectMeta.GetName(), nil
}
+19
View File
@@ -0,0 +1,19 @@
package utils
import (
"testing"
)
func TestGetK8sClient(t *testing.T) {
client, _, err := GetK8sClient()
if err != nil {
t.Logf("test failed due to %s", err.Error())
t.FailNow()
}
if client == nil {
t.Logf("test failed for returned client is empty, this should not happen")
t.FailNow()
}
}
+38
View File
@@ -0,0 +1,38 @@
package utils
import (
"bufio"
"fmt"
"io"
"os/exec"
)
func Run(cmd *exec.Cmd, in io.Reader) error {
cmd.Stdin = in
stdoutReader, _ := cmd.StdoutPipe()
stdoutScanner := bufio.NewScanner(stdoutReader)
go func() {
for stdoutScanner.Scan() {
fmt.Println(stdoutScanner.Text())
}
}()
stderrReader, _ := cmd.StderrPipe()
stderrScanner := bufio.NewScanner(stderrReader)
go func() {
for stderrScanner.Scan() {
fmt.Println(stderrScanner.Text())
}
}()
err := cmd.Start()
if err != nil {
return GenErrorMsg(EXEC_ERROR, err.Error())
}
// Stuck here until there are out and err
err = cmd.Wait()
if err != nil {
return GenErrorMsg(EXEC_ERROR, err.Error())
}
return nil
}
+17
View File
@@ -0,0 +1,17 @@
package utils
import (
"os/exec"
"testing"
)
func TestRun(t *testing.T) {
// Just make sure there is no error...
testCmd := exec.Command("ls")
err := Run(testCmd, nil)
if err != nil {
t.Logf("test failed due to %s", err.Error())
t.FailNow()
}
}
+22
View File
@@ -0,0 +1,22 @@
package utils
import (
"errors"
"fmt"
)
const (
// For errors about kustomize
TEMPLATE_ERROR = "template error"
// For errors about file system
FILE_ERROR = "file system error"
// For errors about create/delete/... resources in cluster
SERVER_ERROR = "cluster operation error"
// For exec errors
EXEC_ERROR = "exec error"
)
func GenErrorMsg(errType, customMsg string) error {
errorMsg := fmt.Sprintf("[ERROR] %s: %s", errType, customMsg)
return errors.New(errorMsg)
}
+38
View File
@@ -0,0 +1,38 @@
package utils
import (
"strings"
"testing"
)
func TestServerGenErrorMsg(t *testing.T) {
expectedErr := GenErrorMsg(SERVER_ERROR, "test for server")
if !strings.Contains(expectedErr.Error(), SERVER_ERROR) {
t.Logf("server error generate failed")
t.FailNow()
}
}
func TestTemplateGenErrorMsg(t *testing.T) {
expectedErr := GenErrorMsg(TEMPLATE_ERROR, "test for template")
if !strings.Contains(expectedErr.Error(), TEMPLATE_ERROR) {
t.Logf("template error generate failed")
t.FailNow()
}
}
func TestExecGenErrorMsg(t *testing.T) {
expectedErr := GenErrorMsg(EXEC_ERROR, "test for exec")
if !strings.Contains(expectedErr.Error(), EXEC_ERROR) {
t.Logf("error error generate failed")
t.FailNow()
}
}
func TestFileGenErrorMsg(t *testing.T) {
expectedErr := GenErrorMsg(FILE_ERROR, "test for file")
if !strings.Contains(expectedErr.Error(), FILE_ERROR) {
t.Logf("file error generate failed")
t.FailNow()
}
}
@@ -3,7 +3,6 @@ package utils
import (
"io"
"io/fs"
"log"
"path"
"strings"
@@ -18,8 +17,7 @@ func GetResourceFileSys() (filesys.FileSystem, error) {
inDiskSys := filesys.MakeFsOnDisk()
// copy from the resources into the target folder on the in memory FS
if err := copyDirtoDiskFS(".", "bilipro", inDiskSys); err != nil {
log.Println(err)
return nil, err
return nil, GenErrorMsg(FILE_ERROR, err.Error())
}
return inDiskSys, nil
}
@@ -34,23 +32,26 @@ func copyFileToDiskFS(src, dst string, diskFS filesys.FileSystem) error {
var dstFileDesc filesys.File
if srcFileDesc, err = assetFS.Open(src); err != nil {
return err
return GenErrorMsg(FILE_ERROR, err.Error())
}
defer srcFileDesc.Close()
if dstFileDesc, err = diskFS.Create(dst); err != nil {
return err
return GenErrorMsg(FILE_ERROR, err.Error())
}
defer dstFileDesc.Close()
// Note: I had to read the whole string, for some reason io.Copy was not copying the whole content
input, err := io.ReadAll(srcFileDesc)
if err != nil {
return err
return GenErrorMsg(FILE_ERROR, err.Error())
}
_, err = dstFileDesc.Write(input)
return err
if err != nil {
return GenErrorMsg(FILE_ERROR, err.Error())
}
return nil
}
func copyDirtoDiskFS(src string, dst string, diskFS filesys.FileSystem) error {
@@ -58,11 +59,11 @@ func copyDirtoDiskFS(src string, dst string, diskFS filesys.FileSystem) error {
var fds []fs.DirEntry
if err = diskFS.MkdirAll(dst); err != nil {
return err
return GenErrorMsg(FILE_ERROR, err.Error())
}
if fds, err = assetFS.ReadDir(src); err != nil {
return err
return GenErrorMsg(FILE_ERROR, err.Error())
}
for _, fd := range fds {
srcfp := path.Join(src, fd.Name())
@@ -70,11 +71,11 @@ func copyDirtoDiskFS(src string, dst string, diskFS filesys.FileSystem) error {
if fd.IsDir() {
if err = copyDirtoDiskFS(srcfp, dstfp, diskFS); err != nil {
return err
return GenErrorMsg(FILE_ERROR, err.Error())
}
} else {
if err = copyFileToDiskFS(srcfp, dstfp, diskFS); err != nil {
return err
return GenErrorMsg(FILE_ERROR, err.Error())
}
}
}
+88
View File
@@ -0,0 +1,88 @@
package utils
import (
"io"
"os"
"path/filepath"
"testing"
"sigs.k8s.io/kustomize/kyaml/filesys"
)
func TestCopyFiletoDiskFS(t *testing.T) {
expectedFile, err := assetFS.Open("base/ns/namespace.yaml")
if err != nil {
t.Logf("test failed due to %s", err.Error())
t.FailNow()
}
expectedOutput, err := io.ReadAll(expectedFile)
if err != nil {
t.Logf("test failed due to %s", err.Error())
t.FailNow()
}
dir, err := os.Getwd()
if err != nil {
t.Logf("test failed due to %s", err.Error())
t.FailNow()
}
inDiskSys := filesys.MakeFsOnDisk()
err = copyFileToDiskFS("base/ns/namespace.yaml", filepath.Join(dir, "fixtures/testNamespace.yaml"), inDiskSys)
if err != nil {
t.Logf("test failed due to %s", err.Error())
t.FailNow()
}
actualOutput, err := os.ReadFile(filepath.Join(dir, "fixtures/testNamespace.yaml"))
if err != nil {
t.Logf("test failed due to %s", err.Error())
t.FailNow()
}
if string(expectedOutput) != string(actualOutput) {
t.Logf("test failed due to copy file failed")
t.FailNow()
}
}
func TestCopyDirtoDiskFS(t *testing.T) {
expectedFile, err := assetFS.Open("base/bilibiliPro/deployment.yaml")
if err != nil {
t.Logf("test failed due to %s", err.Error())
t.FailNow()
}
expectedOutput, err := io.ReadAll(expectedFile)
if err != nil {
t.Logf("test failed due to %s", err.Error())
t.FailNow()
}
dir, err := os.Getwd()
if err != nil {
t.Logf("test failed due to %s", err.Error())
t.FailNow()
}
inDiskSys := filesys.MakeFsOnDisk()
err = copyDirtoDiskFS("base/bilibiliPro", filepath.Join(dir, "fixtures"), inDiskSys)
if err != nil {
t.Logf("test failed due to %s", err.Error())
t.FailNow()
}
actualOutput, err := os.ReadFile(filepath.Join(dir, "fixtures/deployment.yaml"))
if err != nil {
t.Logf("test failed due to %s", err.Error())
t.FailNow()
}
if string(expectedOutput) != string(actualOutput) {
t.Logf("test failed due to copy file failed")
t.FailNow()
}
}