Dragonfly2
973 строки · 26.0 Кб
1/*
2* Copyright 2020 The Dragonfly Authors
3*
4* Licensed under the Apache License, Version 2.0 (the "License");
5* you may not use this file except in compliance with the License.
6* You may obtain a copy of the License at
7*
8* http://www.apache.org/licenses/LICENSE-2.0
9*
10* Unless required by applicable law or agreed to in writing, software
11* distributed under the License is distributed on an "AS IS" BASIS,
12* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13* See the License for the specific language governing permissions and
14* limitations under the License.
15*/
16
17package config
18
19import (
20"net"
21"os"
22"testing"
23"time"
24
25"github.com/stretchr/testify/assert"
26"gopkg.in/yaml.v3"
27
28"d7y.io/dragonfly/v2/pkg/objectstorage"
29"d7y.io/dragonfly/v2/pkg/rpc"
30"d7y.io/dragonfly/v2/pkg/types"
31)
32
33var (
34mockJWTConfig = JWTConfig{
35Realm: "foo",
36Key: "bar",
37Timeout: 30 * time.Second,
38MaxRefresh: 1 * time.Minute,
39}
40
41mockMysqlConfig = MysqlConfig{
42User: "foo",
43Password: "bar",
44Host: "localhost",
45Port: DefaultMysqlPort,
46DBName: DefaultMysqlDBName,
47TLSConfig: "true",
48Migrate: true,
49}
50
51mockMysqlTLSConfig = &MysqlTLSClientConfig{
52Cert: "ca.crt",
53Key: "ca.key",
54CA: "ca",
55InsecureSkipVerify: false,
56}
57
58mockPostgresConfig = PostgresConfig{
59User: "foo",
60Password: "bar",
61Host: "localhost",
62Port: DefaultPostgresPort,
63DBName: DefaultPostgresDBName,
64SSLMode: DefaultPostgresSSLMode,
65PreferSimpleProtocol: DefaultPostgresPreferSimpleProtocol,
66Timezone: DefaultPostgresTimezone,
67Migrate: true,
68}
69
70mockRedisConfig = RedisConfig{
71Addrs: []string{"127.0.0.0:6379"},
72MasterName: "master",
73Username: "baz",
74Password: "bax",
75DB: DefaultRedisDB,
76BrokerDB: DefaultRedisBrokerDB,
77BackendDB: DefaultRedisBackendDB,
78}
79
80mockObjectStorageConfig = ObjectStorageConfig{
81Enable: true,
82Name: objectstorage.ServiceNameS3,
83Region: "bas",
84Endpoint: "127.0.0.1",
85AccessKey: "ak",
86SecretKey: "sk",
87S3ForcePathStyle: true,
88}
89
90mockMetricsConfig = MetricsConfig{
91Enable: true,
92Addr: DefaultMetricsAddr,
93}
94
95mockSecurityConfig = SecurityConfig{
96AutoIssueCert: true,
97CACert: types.PEMContent("foo"),
98CAKey: types.PEMContent("bar"),
99TLSPolicy: rpc.PreferTLSPolicy,
100CertSpec: CertSpec{
101DNSNames: DefaultCertDNSNames,
102IPAddresses: DefaultCertIPAddresses,
103ValidityPeriod: DefaultCertValidityPeriod,
104},
105}
106
107mockTrainerConfig = TrainerConfig{
108Enable: true,
109BucketName: DefaultTrainerBucketName,
110}
111)
112
113func TestConfig_Load(t *testing.T) {
114config := &Config{
115Server: ServerConfig{
116Name: "foo",
117WorkHome: "foo",
118CacheDir: "foo",
119LogDir: "foo",
120PluginDir: "foo",
121GRPC: GRPCConfig{
122AdvertiseIP: net.IPv4zero,
123ListenIP: net.IPv4zero,
124PortRange: TCPListenPortRange{
125Start: 65003,
126End: 65003,
127},
128},
129REST: RESTConfig{
130Addr: ":8080",
131TLS: &TLSServerConfig{
132Cert: "foo",
133Key: "foo",
134},
135},
136},
137Auth: AuthConfig{
138JWT: JWTConfig{
139Realm: "foo",
140Key: "bar",
141Timeout: 30 * time.Second,
142MaxRefresh: 1 * time.Minute,
143},
144},
145Database: DatabaseConfig{
146Type: "mysql",
147Mysql: MysqlConfig{
148User: "foo",
149Password: "foo",
150Host: "foo",
151Port: 3306,
152DBName: "foo",
153TLSConfig: "preferred",
154TLS: &MysqlTLSClientConfig{
155Cert: "foo",
156Key: "foo",
157CA: "foo",
158InsecureSkipVerify: true,
159},
160Migrate: true,
161},
162Postgres: PostgresConfig{
163User: "foo",
164Password: "foo",
165Host: "foo",
166Port: 5432,
167DBName: "foo",
168SSLMode: "disable",
169PreferSimpleProtocol: false,
170Timezone: "UTC",
171Migrate: true,
172},
173Redis: RedisConfig{
174Password: "bar",
175Addrs: []string{"foo", "bar"},
176MasterName: "baz",
177DB: 0,
178BrokerDB: 1,
179BackendDB: 2,
180},
181},
182Cache: CacheConfig{
183Redis: RedisCacheConfig{
184TTL: 1 * time.Second,
185},
186Local: LocalCacheConfig{
187Size: 10000,
188TTL: 1 * time.Second,
189},
190},
191Job: JobConfig{
192Preheat: PreheatConfig{
193RegistryTimeout: DefaultJobPreheatRegistryTimeout,
194TLS: &PreheatTLSClientConfig{
195CACert: "foo",
196},
197},
198SyncPeers: SyncPeersConfig{
199Interval: 13 * time.Hour,
200Timeout: 2 * time.Minute,
201},
202},
203ObjectStorage: ObjectStorageConfig{
204Enable: true,
205Name: objectstorage.ServiceNameS3,
206Endpoint: "127.0.0.1",
207AccessKey: "foo",
208SecretKey: "bar",
209Region: "baz",
210S3ForcePathStyle: false,
211},
212Security: SecurityConfig{
213AutoIssueCert: true,
214CACert: "foo",
215CAKey: "bar",
216TLSPolicy: "force",
217CertSpec: CertSpec{
218DNSNames: []string{"foo"},
219IPAddresses: []net.IP{net.IPv4zero},
220ValidityPeriod: 1 * time.Second,
221},
222},
223Metrics: MetricsConfig{
224Enable: true,
225Addr: ":8000",
226},
227Network: NetworkConfig{
228EnableIPv6: true,
229},
230Trainer: TrainerConfig{
231Enable: true,
232BucketName: "models",
233},
234}
235
236managerConfigYAML := &Config{}
237contentYAML, _ := os.ReadFile("./testdata/manager.yaml")
238if err := yaml.Unmarshal(contentYAML, &managerConfigYAML); err != nil {
239t.Fatal(err)
240}
241
242assert := assert.New(t)
243assert.EqualValues(config, managerConfigYAML)
244}
245
246func TestConfig_Validate(t *testing.T) {
247tests := []struct {
248name string
249config *Config
250mock func(cfg *Config)
251expect func(t *testing.T, err error)
252}{
253{
254name: "valid config",
255config: New(),
256mock: func(cfg *Config) {
257cfg.Auth.JWT = mockJWTConfig
258cfg.Database.Mysql = mockMysqlConfig
259cfg.Database.Redis = mockRedisConfig
260},
261expect: func(t *testing.T, err error) {
262assert := assert.New(t)
263assert.NoError(err)
264},
265},
266{
267name: "server requires parameter name",
268config: New(),
269mock: func(cfg *Config) {
270cfg.Server.Name = ""
271},
272expect: func(t *testing.T, err error) {
273assert := assert.New(t)
274assert.EqualError(err, "server requires parameter name")
275},
276},
277{
278name: "grpc requires parameter advertiseIP",
279config: New(),
280mock: func(cfg *Config) {
281cfg.Server.GRPC.AdvertiseIP = nil
282},
283expect: func(t *testing.T, err error) {
284assert := assert.New(t)
285assert.EqualError(err, "grpc requires parameter advertiseIP")
286},
287},
288{
289name: "grpc requires parameter listenIP",
290config: New(),
291mock: func(cfg *Config) {
292cfg.Server.GRPC.ListenIP = nil
293},
294expect: func(t *testing.T, err error) {
295assert := assert.New(t)
296assert.EqualError(err, "grpc requires parameter listenIP")
297},
298},
299{
300name: "rest tls requires parameter cert",
301config: New(),
302mock: func(cfg *Config) {
303cfg.Server.REST.TLS = &TLSServerConfig{
304Cert: "",
305Key: "foo",
306}
307},
308expect: func(t *testing.T, err error) {
309assert := assert.New(t)
310assert.EqualError(err, "tls requires parameter cert")
311},
312},
313{
314name: "rest tls requires parameter key",
315config: New(),
316mock: func(cfg *Config) {
317cfg.Server.REST.TLS = &TLSServerConfig{
318Cert: "foo",
319Key: "",
320}
321},
322expect: func(t *testing.T, err error) {
323assert := assert.New(t)
324assert.EqualError(err, "tls requires parameter key")
325},
326},
327{
328name: "jwt requires parameter realm",
329config: New(),
330mock: func(cfg *Config) {
331cfg.Auth.JWT.Realm = ""
332},
333expect: func(t *testing.T, err error) {
334assert := assert.New(t)
335assert.EqualError(err, "jwt requires parameter realm")
336},
337},
338{
339name: "jwt requires parameter key",
340config: New(),
341mock: func(cfg *Config) {
342cfg.Auth.JWT.Key = ""
343},
344expect: func(t *testing.T, err error) {
345assert := assert.New(t)
346assert.EqualError(err, "jwt requires parameter key")
347},
348},
349{
350name: "jwt requires parameter timeout",
351config: New(),
352mock: func(cfg *Config) {
353cfg.Auth.JWT = mockJWTConfig
354cfg.Auth.JWT.Timeout = 0
355},
356expect: func(t *testing.T, err error) {
357assert := assert.New(t)
358assert.EqualError(err, "jwt requires parameter timeout")
359},
360},
361{
362name: "jwt requires parameter maxRefresh",
363config: New(),
364mock: func(cfg *Config) {
365cfg.Auth.JWT = mockJWTConfig
366cfg.Auth.JWT.MaxRefresh = 0
367},
368expect: func(t *testing.T, err error) {
369assert := assert.New(t)
370assert.EqualError(err, "jwt requires parameter maxRefresh")
371},
372},
373{
374name: "database requires parameter type",
375config: New(),
376mock: func(cfg *Config) {
377cfg.Auth.JWT = mockJWTConfig
378cfg.Database.Type = ""
379},
380expect: func(t *testing.T, err error) {
381assert := assert.New(t)
382assert.EqualError(err, "database requires parameter type")
383},
384},
385{
386name: "mysql requires parameter user",
387config: New(),
388mock: func(cfg *Config) {
389cfg.Auth.JWT = mockJWTConfig
390cfg.Database.Type = DatabaseTypeMysql
391cfg.Database.Mysql = mockMysqlConfig
392cfg.Database.Mysql.User = ""
393},
394expect: func(t *testing.T, err error) {
395assert := assert.New(t)
396assert.EqualError(err, "mysql requires parameter user")
397},
398},
399{
400name: "mysql requires parameter password",
401config: New(),
402mock: func(cfg *Config) {
403cfg.Auth.JWT = mockJWTConfig
404cfg.Database.Type = DatabaseTypeMysql
405cfg.Database.Mysql = mockMysqlConfig
406cfg.Database.Mysql.Password = ""
407},
408expect: func(t *testing.T, err error) {
409assert := assert.New(t)
410assert.EqualError(err, "mysql requires parameter password")
411},
412},
413{
414name: "mysql requires parameter host",
415config: New(),
416mock: func(cfg *Config) {
417cfg.Auth.JWT = mockJWTConfig
418cfg.Database.Type = DatabaseTypeMysql
419cfg.Database.Mysql = mockMysqlConfig
420cfg.Database.Mysql.Host = ""
421},
422expect: func(t *testing.T, err error) {
423assert := assert.New(t)
424assert.EqualError(err, "mysql requires parameter host")
425},
426},
427{
428name: "mysql requires parameter port",
429config: New(),
430mock: func(cfg *Config) {
431cfg.Auth.JWT = mockJWTConfig
432cfg.Database.Type = DatabaseTypeMysql
433cfg.Database.Mysql = mockMysqlConfig
434cfg.Database.Mysql.Port = 0
435},
436expect: func(t *testing.T, err error) {
437assert := assert.New(t)
438assert.EqualError(err, "mysql requires parameter port")
439},
440},
441{
442name: "mysql requires parameter dbname",
443config: New(),
444mock: func(cfg *Config) {
445cfg.Auth.JWT = mockJWTConfig
446cfg.Database.Type = DatabaseTypeMysql
447cfg.Database.Mysql = mockMysqlConfig
448cfg.Database.Mysql.DBName = ""
449},
450expect: func(t *testing.T, err error) {
451assert := assert.New(t)
452assert.EqualError(err, "mysql requires parameter dbname")
453},
454},
455{
456name: "tls requires parameter cert",
457config: New(),
458mock: func(cfg *Config) {
459cfg.Auth.JWT = mockJWTConfig
460cfg.Database.Type = DatabaseTypeMysql
461cfg.Database.Mysql = mockMysqlConfig
462cfg.Database.Mysql.TLS = mockMysqlTLSConfig
463cfg.Database.Mysql.TLS.Cert = ""
464},
465expect: func(t *testing.T, err error) {
466assert := assert.New(t)
467assert.EqualError(err, "tls requires parameter cert")
468},
469},
470{
471name: "tls requires parameter key",
472config: New(),
473mock: func(cfg *Config) {
474cfg.Auth.JWT = mockJWTConfig
475cfg.Database.Type = DatabaseTypeMysql
476cfg.Database.Mysql = mockMysqlConfig
477cfg.Database.Mysql.TLS = mockMysqlTLSConfig
478cfg.Database.Mysql.TLS.Cert = "ca.crt"
479cfg.Database.Mysql.TLS.Key = ""
480},
481expect: func(t *testing.T, err error) {
482assert := assert.New(t)
483assert.EqualError(err, "tls requires parameter key")
484},
485},
486{
487name: "tls requires parameter ca",
488config: New(),
489mock: func(cfg *Config) {
490cfg.Auth.JWT = mockJWTConfig
491cfg.Database.Type = DatabaseTypeMysql
492cfg.Database.Mysql = mockMysqlConfig
493cfg.Database.Mysql.TLS = mockMysqlTLSConfig
494cfg.Database.Mysql.TLS.Cert = "ca.crt"
495cfg.Database.Mysql.TLS.Key = "ca.key"
496cfg.Database.Mysql.TLS.CA = ""
497},
498expect: func(t *testing.T, err error) {
499assert := assert.New(t)
500assert.EqualError(err, "tls requires parameter ca")
501},
502},
503{
504name: "postgres requires parameter user",
505config: New(),
506mock: func(cfg *Config) {
507cfg.Auth.JWT = mockJWTConfig
508cfg.Database.Type = DatabaseTypePostgres
509cfg.Database.Postgres = mockPostgresConfig
510cfg.Database.Postgres.User = ""
511},
512expect: func(t *testing.T, err error) {
513assert := assert.New(t)
514assert.EqualError(err, "postgres requires parameter user")
515},
516},
517{
518name: "postgres requires parameter password",
519config: New(),
520mock: func(cfg *Config) {
521cfg.Auth.JWT = mockJWTConfig
522cfg.Database.Type = DatabaseTypePostgres
523cfg.Database.Postgres = mockPostgresConfig
524cfg.Database.Postgres.Password = ""
525},
526expect: func(t *testing.T, err error) {
527assert := assert.New(t)
528assert.EqualError(err, "postgres requires parameter password")
529},
530},
531{
532name: "postgres requires parameter host",
533config: New(),
534mock: func(cfg *Config) {
535cfg.Auth.JWT = mockJWTConfig
536cfg.Database.Type = DatabaseTypePostgres
537cfg.Database.Postgres = mockPostgresConfig
538cfg.Database.Postgres.Host = ""
539},
540expect: func(t *testing.T, err error) {
541assert := assert.New(t)
542assert.EqualError(err, "postgres requires parameter host")
543},
544},
545{
546name: "postgres requires parameter port",
547config: New(),
548mock: func(cfg *Config) {
549cfg.Auth.JWT = mockJWTConfig
550cfg.Database.Type = DatabaseTypePostgres
551cfg.Database.Postgres = mockPostgresConfig
552cfg.Database.Postgres.Port = 0
553},
554expect: func(t *testing.T, err error) {
555assert := assert.New(t)
556assert.EqualError(err, "postgres requires parameter port")
557},
558},
559{
560name: "postgres requires parameter dbname",
561config: New(),
562mock: func(cfg *Config) {
563cfg.Auth.JWT = mockJWTConfig
564cfg.Database.Type = DatabaseTypePostgres
565cfg.Database.Postgres = mockPostgresConfig
566cfg.Database.Postgres.DBName = ""
567},
568expect: func(t *testing.T, err error) {
569assert := assert.New(t)
570assert.EqualError(err, "postgres requires parameter dbname")
571},
572},
573{
574name: "postgres requires parameter sslMode",
575config: New(),
576mock: func(cfg *Config) {
577cfg.Auth.JWT = mockJWTConfig
578cfg.Database.Type = DatabaseTypePostgres
579cfg.Database.Postgres = mockPostgresConfig
580cfg.Database.Postgres.SSLMode = ""
581},
582expect: func(t *testing.T, err error) {
583assert := assert.New(t)
584assert.EqualError(err, "postgres requires parameter sslMode")
585},
586},
587{
588name: "postgres requires parameter timezone",
589config: New(),
590mock: func(cfg *Config) {
591cfg.Auth.JWT = mockJWTConfig
592cfg.Database.Type = DatabaseTypePostgres
593cfg.Database.Postgres = mockPostgresConfig
594cfg.Database.Postgres.Timezone = ""
595},
596expect: func(t *testing.T, err error) {
597assert := assert.New(t)
598assert.EqualError(err, "postgres requires parameter timezone")
599},
600},
601{
602name: "redis requires parameter addrs",
603config: New(),
604mock: func(cfg *Config) {
605cfg.Auth.JWT = mockJWTConfig
606cfg.Database.Type = DatabaseTypeMysql
607cfg.Database.Mysql = mockMysqlConfig
608cfg.Database.Redis = mockRedisConfig
609cfg.Database.Redis.Addrs = []string{}
610},
611expect: func(t *testing.T, err error) {
612assert := assert.New(t)
613assert.EqualError(err, "redis requires parameter addrs")
614},
615},
616{
617name: "redis requires parameter db",
618config: New(),
619mock: func(cfg *Config) {
620cfg.Auth.JWT = mockJWTConfig
621cfg.Database.Type = DatabaseTypeMysql
622cfg.Database.Mysql = mockMysqlConfig
623cfg.Database.Redis = mockRedisConfig
624cfg.Database.Redis.DB = -1
625},
626expect: func(t *testing.T, err error) {
627assert := assert.New(t)
628assert.EqualError(err, "redis requires parameter db")
629},
630},
631{
632name: "redis requires parameter brokerDB",
633config: New(),
634mock: func(cfg *Config) {
635cfg.Auth.JWT = mockJWTConfig
636cfg.Database.Type = DatabaseTypeMysql
637cfg.Database.Mysql = mockMysqlConfig
638cfg.Database.Redis = mockRedisConfig
639cfg.Database.Redis.BrokerDB = -1
640},
641expect: func(t *testing.T, err error) {
642assert := assert.New(t)
643assert.EqualError(err, "redis requires parameter brokerDB")
644},
645},
646{
647name: "redis requires parameter backendDB",
648config: New(),
649mock: func(cfg *Config) {
650cfg.Auth.JWT = mockJWTConfig
651cfg.Database.Type = DatabaseTypeMysql
652cfg.Database.Mysql = mockMysqlConfig
653cfg.Database.Redis = mockRedisConfig
654cfg.Database.Redis.BackendDB = -1
655},
656expect: func(t *testing.T, err error) {
657assert := assert.New(t)
658assert.EqualError(err, "redis requires parameter backendDB")
659},
660},
661{
662name: "redis requires parameter ttl",
663config: New(),
664mock: func(cfg *Config) {
665cfg.Auth.JWT = mockJWTConfig
666cfg.Database.Type = DatabaseTypeMysql
667cfg.Database.Mysql = mockMysqlConfig
668cfg.Database.Redis = mockRedisConfig
669cfg.Cache.Redis.TTL = 0
670},
671expect: func(t *testing.T, err error) {
672assert := assert.New(t)
673assert.EqualError(err, "redis requires parameter ttl")
674},
675},
676{
677name: "local requires parameter size",
678config: New(),
679mock: func(cfg *Config) {
680cfg.Auth.JWT = mockJWTConfig
681cfg.Database.Type = DatabaseTypeMysql
682cfg.Database.Mysql = mockMysqlConfig
683cfg.Database.Redis = mockRedisConfig
684cfg.Cache.Local.Size = 0
685},
686expect: func(t *testing.T, err error) {
687assert := assert.New(t)
688assert.EqualError(err, "local requires parameter size")
689},
690},
691{
692name: "local requires parameter ttl",
693config: New(),
694mock: func(cfg *Config) {
695cfg.Auth.JWT = mockJWTConfig
696cfg.Database.Type = DatabaseTypeMysql
697cfg.Database.Mysql = mockMysqlConfig
698cfg.Database.Redis = mockRedisConfig
699cfg.Cache.Local.TTL = 0
700},
701expect: func(t *testing.T, err error) {
702assert := assert.New(t)
703assert.EqualError(err, "local requires parameter ttl")
704},
705},
706{
707name: "preheat requires parameter caCert",
708config: New(),
709mock: func(cfg *Config) {
710cfg.Auth.JWT = mockJWTConfig
711cfg.Database.Type = DatabaseTypeMysql
712cfg.Database.Mysql = mockMysqlConfig
713cfg.Database.Redis = mockRedisConfig
714cfg.Job.Preheat.TLS = &PreheatTLSClientConfig{
715CACert: "",
716}
717},
718expect: func(t *testing.T, err error) {
719assert := assert.New(t)
720assert.EqualError(err, "preheat requires parameter caCert")
721},
722},
723{
724name: "preheat requires parameter registryTimeout",
725config: New(),
726mock: func(cfg *Config) {
727cfg.Auth.JWT = mockJWTConfig
728cfg.Database.Type = DatabaseTypeMysql
729cfg.Database.Mysql = mockMysqlConfig
730cfg.Database.Redis = mockRedisConfig
731cfg.Job.Preheat.RegistryTimeout = 0
732},
733expect: func(t *testing.T, err error) {
734assert := assert.New(t)
735assert.EqualError(err, "preheat requires parameter registryTimeout")
736},
737},
738{
739name: "syncPeers requires parameter interval",
740config: New(),
741mock: func(cfg *Config) {
742cfg.Auth.JWT = mockJWTConfig
743cfg.Database.Type = DatabaseTypeMysql
744cfg.Database.Mysql = mockMysqlConfig
745cfg.Database.Redis = mockRedisConfig
746cfg.Job.SyncPeers.Interval = 11 * time.Hour
747},
748expect: func(t *testing.T, err error) {
749assert := assert.New(t)
750assert.EqualError(err, "syncPeers requires parameter interval and it must be greater than 12 hours")
751},
752},
753{
754name: "syncPeers requires parameter timeout",
755config: New(),
756mock: func(cfg *Config) {
757cfg.Auth.JWT = mockJWTConfig
758cfg.Database.Type = DatabaseTypeMysql
759cfg.Database.Mysql = mockMysqlConfig
760cfg.Database.Redis = mockRedisConfig
761cfg.Job.SyncPeers.Timeout = 0
762},
763expect: func(t *testing.T, err error) {
764assert := assert.New(t)
765assert.EqualError(err, "syncPeers requires parameter timeout")
766},
767},
768{
769name: "objectStorage requires parameter name",
770config: New(),
771mock: func(cfg *Config) {
772cfg.Auth.JWT = mockJWTConfig
773cfg.Database.Type = DatabaseTypeMysql
774cfg.Database.Mysql = mockMysqlConfig
775cfg.Database.Redis = mockRedisConfig
776cfg.ObjectStorage = mockObjectStorageConfig
777cfg.ObjectStorage.Name = ""
778},
779expect: func(t *testing.T, err error) {
780assert := assert.New(t)
781assert.EqualError(err, "objectStorage requires parameter name")
782},
783},
784{
785name: "invalid objectStorage name",
786config: New(),
787mock: func(cfg *Config) {
788cfg.Auth.JWT = mockJWTConfig
789cfg.Database.Type = DatabaseTypeMysql
790cfg.Database.Mysql = mockMysqlConfig
791cfg.Database.Redis = mockRedisConfig
792cfg.ObjectStorage = mockObjectStorageConfig
793cfg.ObjectStorage.Name = "foo"
794},
795expect: func(t *testing.T, err error) {
796assert := assert.New(t)
797assert.EqualError(err, "objectStorage requires parameter name")
798},
799},
800{
801name: "objectStorage requires parameter accessKey",
802config: New(),
803mock: func(cfg *Config) {
804cfg.Auth.JWT = mockJWTConfig
805cfg.Database.Type = DatabaseTypeMysql
806cfg.Database.Mysql = mockMysqlConfig
807cfg.Database.Redis = mockRedisConfig
808cfg.ObjectStorage = mockObjectStorageConfig
809cfg.ObjectStorage.AccessKey = ""
810},
811expect: func(t *testing.T, err error) {
812assert := assert.New(t)
813assert.EqualError(err, "objectStorage requires parameter accessKey")
814},
815},
816{
817name: "objectStorage requires parameter secretKey",
818config: New(),
819mock: func(cfg *Config) {
820cfg.Auth.JWT = mockJWTConfig
821cfg.Database.Type = DatabaseTypeMysql
822cfg.Database.Mysql = mockMysqlConfig
823cfg.Database.Redis = mockRedisConfig
824cfg.ObjectStorage = mockObjectStorageConfig
825cfg.ObjectStorage.SecretKey = ""
826},
827expect: func(t *testing.T, err error) {
828assert := assert.New(t)
829assert.EqualError(err, "objectStorage requires parameter secretKey")
830},
831},
832{
833name: "metrics requires parameter addr",
834config: New(),
835mock: func(cfg *Config) {
836cfg.Auth.JWT = mockJWTConfig
837cfg.Database.Type = DatabaseTypeMysql
838cfg.Database.Mysql = mockMysqlConfig
839cfg.Database.Redis = mockRedisConfig
840cfg.Metrics = mockMetricsConfig
841cfg.Metrics.Addr = ""
842},
843expect: func(t *testing.T, err error) {
844assert := assert.New(t)
845assert.EqualError(err, "metrics requires parameter addr")
846},
847},
848{
849name: "security requires parameter caCert",
850config: New(),
851mock: func(cfg *Config) {
852cfg.Auth.JWT = mockJWTConfig
853cfg.Database.Type = DatabaseTypeMysql
854cfg.Database.Mysql = mockMysqlConfig
855cfg.Database.Redis = mockRedisConfig
856cfg.Security = mockSecurityConfig
857cfg.Security.CACert = ""
858},
859expect: func(t *testing.T, err error) {
860assert := assert.New(t)
861assert.EqualError(err, "security requires parameter caCert")
862},
863},
864{
865name: "security requires parameter caKey",
866config: New(),
867mock: func(cfg *Config) {
868cfg.Auth.JWT = mockJWTConfig
869cfg.Database.Type = DatabaseTypeMysql
870cfg.Database.Mysql = mockMysqlConfig
871cfg.Database.Redis = mockRedisConfig
872cfg.Security = mockSecurityConfig
873cfg.Security.CAKey = ""
874},
875expect: func(t *testing.T, err error) {
876assert := assert.New(t)
877assert.EqualError(err, "security requires parameter caKey")
878},
879},
880{
881name: "security requires parameter tlsPolicy",
882config: New(),
883mock: func(cfg *Config) {
884cfg.Auth.JWT = mockJWTConfig
885cfg.Database.Type = DatabaseTypeMysql
886cfg.Database.Mysql = mockMysqlConfig
887cfg.Database.Redis = mockRedisConfig
888cfg.Security = mockSecurityConfig
889cfg.Security.TLSPolicy = ""
890},
891expect: func(t *testing.T, err error) {
892assert := assert.New(t)
893assert.EqualError(err, "security requires parameter tlsPolicy")
894},
895},
896{
897name: "certSpec requires parameter ipAddresses",
898config: New(),
899mock: func(cfg *Config) {
900cfg.Auth.JWT = mockJWTConfig
901cfg.Database.Type = DatabaseTypeMysql
902cfg.Database.Mysql = mockMysqlConfig
903cfg.Database.Redis = mockRedisConfig
904cfg.Security = mockSecurityConfig
905cfg.Security.CertSpec.IPAddresses = []net.IP{}
906},
907expect: func(t *testing.T, err error) {
908assert := assert.New(t)
909assert.EqualError(err, "certSpec requires parameter ipAddresses")
910},
911},
912{
913name: "certSpec requires parameter dnsNames",
914config: New(),
915mock: func(cfg *Config) {
916cfg.Auth.JWT = mockJWTConfig
917cfg.Database.Type = DatabaseTypeMysql
918cfg.Database.Mysql = mockMysqlConfig
919cfg.Database.Redis = mockRedisConfig
920cfg.Security = mockSecurityConfig
921cfg.Security.CertSpec.DNSNames = []string{}
922},
923expect: func(t *testing.T, err error) {
924assert := assert.New(t)
925assert.EqualError(err, "certSpec requires parameter dnsNames")
926},
927},
928{
929name: "certSpec requires parameter validityPeriod",
930config: New(),
931mock: func(cfg *Config) {
932cfg.Auth.JWT = mockJWTConfig
933cfg.Database.Type = DatabaseTypeMysql
934cfg.Database.Mysql = mockMysqlConfig
935cfg.Database.Redis = mockRedisConfig
936cfg.Security = mockSecurityConfig
937cfg.Security.CertSpec.ValidityPeriod = 0
938},
939expect: func(t *testing.T, err error) {
940assert := assert.New(t)
941assert.EqualError(err, "certSpec requires parameter validityPeriod")
942},
943},
944{
945name: "trainer requires parameter bucketName",
946config: New(),
947mock: func(cfg *Config) {
948cfg.Auth.JWT = mockJWTConfig
949cfg.Database.Type = DatabaseTypeMysql
950cfg.Database.Mysql = mockMysqlConfig
951cfg.Database.Redis = mockRedisConfig
952cfg.Security = mockSecurityConfig
953cfg.Trainer = mockTrainerConfig
954cfg.Trainer.BucketName = ""
955},
956expect: func(t *testing.T, err error) {
957assert := assert.New(t)
958assert.EqualError(err, "trainer requires parameter bucketName")
959},
960},
961}
962
963for _, tc := range tests {
964t.Run(tc.name, func(t *testing.T) {
965if err := tc.config.Convert(); err != nil {
966t.Fatal(err)
967}
968
969tc.mock(tc.config)
970tc.expect(t, tc.config.Validate())
971})
972}
973}
974