Skip to content

Commit df9905b

Browse files
committed
fix: cannot start with tls
1 parent c596c9b commit df9905b

File tree

9 files changed

+89
-53
lines changed

9 files changed

+89
-53
lines changed

.gitignore

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,11 @@ console/atest-desktop/atest.exe
2121
console/atest-desktop/coverage
2222
atest-store-git
2323
.db
24-
.marscode/
24+
.marscode/
25+
e2e/test.pem
26+
e2e/test.csr
27+
e2e/test.key
28+
e2e/server.srl
29+
e2e/server.key
30+
e2e/server.csr
31+
e2e/server.crt

cmd/server.go

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,8 @@ func createServerCmd(execer fakeruntime.Execer, httpServer server.HTTPServer) (c
109109

110110
// gc related flags
111111
flags.IntVarP(&opt.gcPercent, "gc-percent", "", 100, "The GC percent of Go")
112-
//grpc_tls
113-
flags.BoolVarP(&opt.tls, "tls-grpc", "", false, "Enable TLS mode. Set to true to enable TLS. Alow SAN certificates")
112+
113+
flags.BoolVarP(&opt.tls, "tls", "", false, "Enable TLS mode. Set to true to enable TLS. Alow SAN certificates")
114114
flags.StringVarP(&opt.tlsCert, "cert-file", "", "", "The path to the certificate file, Alow SAN certificates")
115115
flags.StringVarP(&opt.tlsKey, "key-file", "", "", "The path to the key file, Alow SAN certificates")
116116

@@ -124,8 +124,12 @@ type serverOption struct {
124124
httpServer server.HTTPServer
125125
execer fakeruntime.Execer
126126

127-
port int
128-
httpPort int
127+
port int
128+
httpPort int
129+
tls bool
130+
tlsCert string
131+
tlsKey string
132+
129133
printProto bool
130134
localStorage []string
131135
consolePath string
@@ -148,17 +152,12 @@ type serverOption struct {
148152
mockConfig []string
149153
mockPrefix string
150154

151-
gcPercent int
152-
153-
dryRun bool
154-
155+
gcPercent int
156+
dryRun bool
155157
grpcMaxRecvMsgSize int
156158

157159
// inner fields, not as command flags
158160
provider oauth.OAuthProvider
159-
tls bool
160-
tlsCert string
161-
tlsKey string
162161
}
163162

164163
func (o *serverOption) preRunE(cmd *cobra.Command, args []string) (err error) {
@@ -190,15 +189,20 @@ func (o *serverOption) preRunE(cmd *cobra.Command, args []string) (err error) {
190189

191190
grpcOpts = append(grpcOpts, atestoauth.NewAuthInterceptor(o.oauthGroup))
192191
}
192+
193193
if o.tls {
194194
if o.tlsCert != "" && o.tlsKey != "" {
195195
creds, err := credentials.NewServerTLSFromFile(o.tlsCert, o.tlsKey)
196196
if err != nil {
197197
return fmt.Errorf("failed to load credentials: %v", err)
198198
}
199199
grpcOpts = append(grpcOpts, grpc.Creds(creds))
200+
} else {
201+
err = fmt.Errorf("both --cert-file and --key-file flags are required when --tls is enabled")
202+
return
200203
}
201204
}
205+
202206
if o.dryRun {
203207
o.gRPCServer = &fakeGRPCServer{}
204208
} else {
@@ -278,7 +282,7 @@ func (o *serverOption) runE(cmd *cobra.Command, args []string) (err error) {
278282
mockWriter = mock.NewInMemoryReader("")
279283
}
280284

281-
dynamicMockServer := mock.NewInMemoryServer(cmd.Context(), 0)
285+
dynamicMockServer := mock.NewInMemoryServer(cmd.Context(), 0).WithTLS(o.tlsCert, o.tlsKey)
282286
mockServerController := server.NewMockServerController(mockWriter, dynamicMockServer, o.httpPort)
283287

284288
clean := make(chan os.Signal, 1)
@@ -330,15 +334,18 @@ func (o *serverOption) runE(cmd *cobra.Command, args []string) (err error) {
330334
gRPCServerAddr := fmt.Sprintf("127.0.0.1:%s", gRPCServerPort)
331335

332336
if o.tls {
333-
creds, err := credentials.NewClientTLSFromFile(o.tlsCert, "localhost")
337+
var creds credentials.TransportCredentials
338+
creds, err = credentials.NewClientTLSFromFile(o.tlsCert, "127.0.0.1")
334339
if err != nil {
335340
return fmt.Errorf("failed to load credentials: %v", err)
336341
}
342+
343+
opts := []grpc.DialOption{grpc.WithTransportCredentials(creds)}
337344
err = errors.Join(
338-
server.RegisterRunnerHandlerFromEndpoint(ctx, mux, gRPCServerAddr, []grpc.DialOption{grpc.WithTransportCredentials(creds)}),
339-
server.RegisterMockHandlerFromEndpoint(ctx, mux, gRPCServerAddr, []grpc.DialOption{grpc.WithTransportCredentials(creds)}),
340-
server.RegisterThemeExtensionHandlerFromEndpoint(ctx, mux, gRPCServerAddr, []grpc.DialOption{grpc.WithTransportCredentials(creds)}),
341-
server.RegisterDataServerHandlerFromEndpoint(ctx, mux, gRPCServerAddr, []grpc.DialOption{grpc.WithTransportCredentials(creds)}))
345+
server.RegisterRunnerHandlerFromEndpoint(ctx, mux, gRPCServerAddr, opts),
346+
server.RegisterMockHandlerFromEndpoint(ctx, mux, gRPCServerAddr, opts),
347+
server.RegisterThemeExtensionHandlerFromEndpoint(ctx, mux, gRPCServerAddr, opts),
348+
server.RegisterDataServerHandlerFromEndpoint(ctx, mux, gRPCServerAddr, opts))
342349
} else {
343350
dialOption := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials()),
344351
grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(math.MaxInt))}

console/atest-ui/src/views/net.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1313
See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
16-
import { ca } from 'element-plus/es/locales.mjs';
1716
import { Cache } from './cache'
1817

1918
/**

e2e/entrypoint.sh

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,33 +5,15 @@ SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
55
mkdir -p /root/.config/atest
66
mkdir -p /var/data
77

8-
# Generate private key
9-
openssl genrsa -out server.key 2048
10-
# Generate self-signed certificate
11-
openssl req -new -x509 -key server.key -out server.crt -days 36500 \
12-
-subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com"
13-
# Generate Certificate Signing Request (CSR)
14-
openssl req -new -key server.key -out server.csr \
15-
-subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com"
16-
# Generate a new private key
17-
openssl genpkey -algorithm RSA -out test.key
18-
# Generate a new CSR
19-
openssl req -new -nodes -key test.key -out test.csr -days 3650 \
20-
-subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" \
21-
-config "openssl.cnf" -extensions v3_req
22-
# Sign the new CSR with the self-signed certificate
23-
openssl x509 -req -days 365 -in test.csr \
24-
-out test.pem -CA server.crt -CAkey server.key \
25-
-CAcreateserial -extfile "openssl.cnf" -extensions v3_req
26-
278
echo "start to download extenions"
289
atest extension --output /usr/local/bin --registry ghcr.io git
2910
atest extension --output /usr/local/bin --registry ghcr.io orm
3011
atest extension --output /usr/local/bin --registry ghcr.io etcd
3112
atest extension --output /usr/local/bin --registry ghcr.io mongodb
3213

3314
echo "start to run server"
34-
nohup atest server --tls-grpc --cert-file test.pem --key-file test.key&
15+
./generate-tls.sh
16+
nohup atest server --tls --cert-file test.pem --key-file test.key&
3517
cmd="atest run -p test-suite-common.yaml --request-ignore-error"
3618

3719
echo "start to run testing: $cmd"

e2e/generate-tls.sh

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#!/bin/bash
2+
set -e
3+
4+
# Generate private key
5+
openssl genrsa -out server.key 2048
6+
# Generate self-signed certificate
7+
openssl req -new -x509 -key server.key -out server.crt -days 36500 \
8+
-subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=atest" \
9+
# Generate Certificate Signing Request (CSR)
10+
openssl req -new -key server.key -out server.csr \
11+
-subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=atest" \
12+
# Generate a new private key
13+
openssl genpkey -algorithm RSA -out test.key
14+
# Generate a new CSR
15+
openssl req -new -nodes -key test.key -out test.csr -days 3650 \
16+
-subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=atest" \
17+
-config "openssl.cnf" -extensions v3_req
18+
# Sign the new CSR with the self-signed certificate
19+
openssl x509 -req -days 365 -in test.csr \
20+
-out test.pem -CA server.crt -CAkey server.key \
21+
-CAcreateserial -extfile "openssl.cnf" -extensions v3_req

e2e/openssl.cnf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,3 +397,4 @@ system_default = system_default_sect
397397
CipherString = DEFAULT:@SECLEVEL=2
398398
[ alt_names ]
399399
DNS.1 = localhost
400+
IP.1 = 127.0.0.1

pkg/mock/in_memory.go

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -47,16 +47,17 @@ var (
4747
)
4848

4949
type inMemoryServer struct {
50-
data map[string][]map[string]interface{}
51-
mux *mux.Router
52-
listener net.Listener
53-
port int
54-
prefix string
55-
wg sync.WaitGroup
56-
ctx context.Context
57-
cancelFunc context.CancelFunc
58-
reader Reader
59-
metrics RequestMetrics
50+
data map[string][]map[string]interface{}
51+
mux *mux.Router
52+
listener net.Listener
53+
certFile, keyFile string
54+
port int
55+
prefix string
56+
wg sync.WaitGroup
57+
ctx context.Context
58+
cancelFunc context.CancelFunc
59+
reader Reader
60+
metrics RequestMetrics
6061
}
6162

6263
func NewInMemoryServer(ctx context.Context, port int) DynamicServer {
@@ -82,6 +83,12 @@ func (s *inMemoryServer) SetupHandler(reader Reader, prefix string) (handler htt
8283
return
8384
}
8485

86+
func (s *inMemoryServer) WithTLS(certFile, keyFile string) DynamicServer {
87+
s.certFile = certFile
88+
s.keyFile = keyFile
89+
return s
90+
}
91+
8592
func (s *inMemoryServer) Load() (err error) {
8693
var server *Server
8794
if server, err = s.reader.Parse(); err != nil {
@@ -129,9 +136,7 @@ func (s *inMemoryServer) httpProxy(proxy *Proxy) {
129136
proxy.Target += "/"
130137
}
131138
targetPath := strings.TrimPrefix(req.URL.Path, s.prefix)
132-
if strings.HasPrefix(targetPath, "/") {
133-
targetPath = strings.TrimPrefix(targetPath, "/")
134-
}
139+
targetPath = strings.TrimPrefix(targetPath, "/")
135140

136141
apiRaw := fmt.Sprintf("%s%s", proxy.Target, targetPath)
137142
api, err := render.Render("proxy api", apiRaw, s)
@@ -238,7 +243,14 @@ func (s *inMemoryServer) Start(reader Reader, prefix string) (err error) {
238243
if handler, err = s.SetupHandler(reader, prefix); err == nil {
239244
if s.listener, err = net.Listen("tcp", fmt.Sprintf(":%d", s.port)); err == nil {
240245
go func() {
241-
err = http.Serve(s.listener, handler)
246+
if s.certFile != "" && s.keyFile != "" {
247+
if err = http.ServeTLS(s.listener, handler, s.certFile, s.keyFile); err != nil {
248+
memLogger.Error(err, "failed to start TLS mock server")
249+
}
250+
} else {
251+
memLogger.Info("start HTTP mock server")
252+
err = http.Serve(s.listener, handler)
253+
}
242254
}()
243255
}
244256
}

pkg/mock/server.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ type Loadable interface {
2626
type DynamicServer interface {
2727
Start(reader Reader, prefix string) error
2828
SetupHandler(reader Reader, prefix string) (http.Handler, error)
29+
WithTLS(certFile, keyFile string) DynamicServer
2930
Stop() error
3031
GetPort() string
3132
EnableMetrics()

tools/make/run.mk

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@ run-backend:
1515
go run . server --local-storage 'bin/*.yaml' --console-path ${ATEST_UI}/dist \
1616
--extension-registry ghcr.io --download-timeout 10m
1717

18+
run-tls-backend:
19+
go run . server --local-storage 'bin/*.yaml' --console-path ${ATEST_UI}/dist \
20+
--extension-registry ghcr.io --download-timeout 10m \
21+
--tls --cert-file e2e/test.pem \
22+
--key-file e2e/test.key
23+
1824
.PHONY: run-console
1925
run-console: ## Run the API Testing console
2026
run-console:

0 commit comments

Comments
 (0)