Skip to content

Commit f6b9297

Browse files
committed
feat: adds license check
1 parent 48cff08 commit f6b9297

File tree

11 files changed

+142
-19
lines changed

11 files changed

+142
-19
lines changed

server/controller/config/common/config.go

+7
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,13 @@ type Swagger struct {
2020
Enabled bool `default:"true" yaml:"enabled"`
2121
}
2222

23+
type Warrant struct {
24+
Enabled bool `default:"false" yaml:"enabled"`
25+
Host string `default:"warrant" yaml:"host"`
26+
Port int `default:"20413" yaml:"port"`
27+
Timeout int `default:"30" yaml:"timeout"`
28+
}
29+
2330
// TODO use this
2431
type FPermit struct {
2532
Enabled bool `default:"false" yaml:"enabled"`

server/controller/controller/controller.go

+3
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import (
4040
"github.com/deepflowio/deepflow/server/controller/http/router"
4141
"github.com/deepflowio/deepflow/server/controller/manager"
4242
"github.com/deepflowio/deepflow/server/controller/monitor"
43+
"github.com/deepflowio/deepflow/server/controller/monitor/license"
4344
"github.com/deepflowio/deepflow/server/controller/native_field"
4445
"github.com/deepflowio/deepflow/server/controller/prometheus"
4546
"github.com/deepflowio/deepflow/server/controller/recorder"
@@ -180,6 +181,8 @@ func Start(ctx context.Context, configPath, serverLogFile string, shared *server
180181
// native field
181182
native_field.Refresh()
182183

184+
license.BuildChecker().Init(cfg.MonitorCfg.Warrant)
185+
183186
router.SetInitStageForHealthChecker("Register routers init")
184187
httpServer.SetControllerChecker(controllerCheck)
185188
httpServer.SetAnalyzerChecker(analyzerCheck)

server/controller/http/common/const.go

+1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ const (
4949

5050
// map to http.StatusForbidden
5151
NO_PERMISSIONS = "NO_PERMISSIONS"
52+
NO_LICENSE = "NO_LICENSE"
5253

5354
// map to http.StatusPartialContent
5455
PARTIAL_CONTENT = "PARTIAL_RESULT"

server/controller/http/router/agent/agent_cmd.go

+11
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import (
3737
httpcommon "github.com/deepflowio/deepflow/server/controller/http/common"
3838
"github.com/deepflowio/deepflow/server/controller/http/common/response"
3939
service "github.com/deepflowio/deepflow/server/controller/http/service/agent"
40+
"github.com/deepflowio/deepflow/server/controller/monitor/license"
4041
)
4142

4243
const (
@@ -112,6 +113,16 @@ func forwardToServerConnectedByAgent() gin.HandlerFunc {
112113
c.Abort()
113114
return
114115
}
116+
if ok, err := license.GetChecker().AgentHasObtained(agent, common.AGENT_LICENSE_FUNCTION_LEGACY_PROBE); !ok {
117+
if err != nil {
118+
log.Error(err, db.LogPrefixORGID)
119+
response.JSON(c, response.SetOptStatus(httpcommon.NO_PERMISSIONS), response.SetError(err))
120+
}
121+
response.JSON(c, response.SetOptStatus(httpcommon.NO_PERMISSIONS), response.SetError(fmt.Errorf("agent(%s) license not support probe command", agent.Name)))
122+
c.Abort()
123+
return
124+
}
125+
115126
key := agent.CtrlIP + "-" + agent.CtrlMac
116127
// handle forward times
117128
var forwardTimes int

server/controller/http/router/resource/domain.go

+28-10
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,15 @@ import (
2929
"github.com/op/go-logging"
3030
"gopkg.in/yaml.v2"
3131

32+
ctrlCommon "github.com/deepflowio/deepflow/server/controller/common"
3233
"github.com/deepflowio/deepflow/server/controller/config"
3334
metadbcommon "github.com/deepflowio/deepflow/server/controller/db/metadb/common"
3435
httpcommon "github.com/deepflowio/deepflow/server/controller/http/common"
3536
"github.com/deepflowio/deepflow/server/controller/http/common/response"
3637
"github.com/deepflowio/deepflow/server/controller/http/router/common"
3738
"github.com/deepflowio/deepflow/server/controller/http/service/resource"
3839
"github.com/deepflowio/deepflow/server/controller/model"
40+
"github.com/deepflowio/deepflow/server/controller/monitor/license"
3941
)
4042

4143
var log = logging.MustGetLogger("controller.resource")
@@ -64,11 +66,11 @@ func (d *Domain) RegisterTo(e *gin.Engine) {
6466
e.PATCH("/v2/sub-domains/:lcuuid/", updateSubDomain(d.cfg))
6567
e.DELETE("/v2/sub-domains/:lcuuid/", deleteSubDomain(d.cfg))
6668

67-
e.PUT("/v1/domain-additional-resources/", applyDomainAddtionalResource)
68-
e.GET("/v1/domain-additional-resources/", listDomainAddtionalResource)
69+
e.PUT("/v1/domain-additional-resources/", applyDomainAdditionalResource)
70+
e.GET("/v1/domain-additional-resources/", listDomainAdditionalResource)
6971
e.GET("/v1/domain-additional-resources/example/", GetDomainAdditionalResourceExample)
70-
e.PATCH("/v1/domain-additional-resources/advanced/", updateDomainAddtionalResourceAdvanced)
71-
e.GET("/v1/domain-additional-resources/advanced/", getDomainAddtionalResourceAdvanced)
72+
e.PATCH("/v1/domain-additional-resources/advanced/", updateDomainAdditionalResourceAdvanced)
73+
e.GET("/v1/domain-additional-resources/advanced/", getDomainAdditionalResourceAdvanced)
7274
}
7375

7476
func getDomain(cfg *config.ControllerConfig) gin.HandlerFunc {
@@ -397,7 +399,15 @@ func updateSubDomain(cfg *config.ControllerConfig) gin.HandlerFunc {
397399
})
398400
}
399401

400-
func applyDomainAddtionalResource(c *gin.Context) {
402+
func applyDomainAdditionalResource(c *gin.Context) {
403+
if ok, err := license.GetChecker().HasObtained(ctrlCommon.AGENT_LICENSE_FUNCTION_ASSET_CMDB); !ok {
404+
if err != nil {
405+
response.JSON(c, response.SetOptStatus(httpcommon.SERVER_ERROR), response.SetError(err))
406+
}
407+
response.JSON(c, response.SetOptStatus(httpcommon.NO_LICENSE), response.SetError(fmt.Errorf("no license to asset cmdb")))
408+
return
409+
}
410+
401411
b, err := io.ReadAll(c.Request.Body)
402412
if err != nil {
403413
response.JSON(c, response.SetOptStatus(httpcommon.SERVER_ERROR), response.SetError(err))
@@ -423,11 +433,11 @@ func applyDomainAddtionalResource(c *gin.Context) {
423433
return
424434
}
425435

426-
err = resource.ApplyDomainAddtionalResource(data, db)
436+
err = resource.ApplyDomainAdditionalResource(data, db)
427437
response.JSON(c, response.SetError(err))
428438
}
429439

430-
func listDomainAddtionalResource(c *gin.Context) {
440+
func listDomainAdditionalResource(c *gin.Context) {
431441
var resourceType, resourceName string
432442
t, ok := c.GetQuery("type")
433443
if ok {
@@ -457,7 +467,15 @@ func GetDomainAdditionalResourceExample(c *gin.Context) {
457467
response.JSON(c, response.SetData(data), response.SetError(err))
458468
}
459469

460-
func updateDomainAddtionalResourceAdvanced(c *gin.Context) {
470+
func updateDomainAdditionalResourceAdvanced(c *gin.Context) {
471+
if ok, err := license.GetChecker().HasObtained(ctrlCommon.AGENT_LICENSE_FUNCTION_ASSET_CMDB); !ok {
472+
if err != nil {
473+
response.JSON(c, response.SetOptStatus(httpcommon.SERVER_ERROR), response.SetError(err))
474+
}
475+
response.JSON(c, response.SetOptStatus(httpcommon.NO_LICENSE), response.SetError(fmt.Errorf("no license to asset cmdb")))
476+
return
477+
}
478+
461479
db, err := common.GetContextOrgDB(c)
462480
if err != nil {
463481
response.JSON(c, response.SetOptStatus(httpcommon.GET_ORG_DB_FAIL), response.SetError(err))
@@ -467,7 +485,7 @@ func updateDomainAddtionalResourceAdvanced(c *gin.Context) {
467485
data := &model.AdditionalResource{}
468486
err = c.ShouldBindBodyWith(&data, binding.YAML)
469487
if err == nil || err == io.EOF {
470-
if err = resource.ApplyDomainAddtionalResource(*data, db); err != nil {
488+
if err = resource.ApplyDomainAdditionalResource(*data, db); err != nil {
471489
response.JSON(c, response.SetError(err))
472490
return
473491
}
@@ -488,7 +506,7 @@ func updateDomainAddtionalResourceAdvanced(c *gin.Context) {
488506
}
489507
}
490508

491-
func getDomainAddtionalResourceAdvanced(c *gin.Context) {
509+
func getDomainAdditionalResourceAdvanced(c *gin.Context) {
492510
db, err := common.GetContextOrgDB(c)
493511
if err != nil {
494512
response.JSON(c, response.SetOptStatus(httpcommon.GET_ORG_DB_FAIL), response.SetError(err))

server/controller/http/service/resource/domain_additional_resource.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ func newAddtionalResourceToolDataSet(regionUUID string) *addtionalResourceToolDa
7474
}
7575
}
7676

77-
func ApplyDomainAddtionalResource(reqData model.AdditionalResource, orgDB *metadb.DB) error {
77+
func ApplyDomainAdditionalResource(reqData model.AdditionalResource, orgDB *metadb.DB) error {
7878
log.Infof("apply domain additional resource: %#v", reqData, orgDB.LogPrefixORGID)
7979
domainUUIDToToolDataSet, err := generateToolDataSet(reqData, orgDB)
8080
if err != nil {

server/controller/monitor/common.go

+7
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,20 @@ import (
2222
"time"
2323

2424
"github.com/deepflowio/deepflow/server/controller/common"
25+
configs "github.com/deepflowio/deepflow/server/controller/config/common"
2526
"github.com/deepflowio/deepflow/server/controller/db/metadb"
2627
metadbmodel "github.com/deepflowio/deepflow/server/controller/db/metadb/model"
2728
"github.com/deepflowio/deepflow/server/libs/logger"
2829
)
2930

3031
var log = logger.MustGetLogger("monitor")
3132

33+
type LicenseChecker interface {
34+
Init(configs.Warrant)
35+
HasObtained(function int) (bool, error)
36+
AgentHasObtained(agent *metadbmodel.VTap, function int) (bool, error)
37+
}
38+
3239
type dfHostCheck struct {
3340
lastTimeUnix int64
3441
}

server/controller/monitor/config/config.go

+4-6
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,9 @@
1616

1717
package config
1818

19-
type Warrant struct {
20-
Host string `default:"warrant" yaml:"warrant"`
21-
Port int `default:"20413" yaml:"port"`
22-
Timeout int `default:"30" yaml:"timeout"`
23-
}
19+
import (
20+
configs "github.com/deepflowio/deepflow/server/controller/config/common"
21+
)
2422

2523
type MonitorConfig struct {
2624
HealthCheckInterval int `default:"60" yaml:"health_check_interval"`
@@ -32,7 +30,7 @@ type MonitorConfig struct {
3230
AutoRebalanceVTap bool `default:"true" yaml:"auto_rebalance_vtap"`
3331
RebalanceCheckInterval int `default:"300" yaml:"rebalance_check_interval"` // unit: second
3432
VTapAutoDelete VTapAutoDelete `yaml:"vtap_auto_delete"`
35-
Warrant Warrant `yaml:"warrant"`
33+
Warrant configs.Warrant `yaml:"warrant"`
3634
IngesterLoadBalancingConfig IngesterLoadBalancingStrategy `yaml:"ingester-load-balancing-strategy"`
3735
SyncDefaultORGDataInterval int `default:"10" yaml:"sync_default_org_data_interval"`
3836
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/*
2+
* Copyright (c) 2024 Yunshan Networks
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+
17+
package license
18+
19+
import (
20+
"sync"
21+
22+
configs "github.com/deepflowio/deepflow/server/controller/config/common"
23+
"github.com/deepflowio/deepflow/server/controller/monitor"
24+
metadbmodel "github.com/deepflowio/deepflow/server/controller/db/metadb/model"
25+
)
26+
27+
var (
28+
checkerOnce sync.Once
29+
checker *Checker
30+
)
31+
32+
type Checker struct{}
33+
34+
func BuildChecker() *Checker {
35+
checkerOnce.Do(func() {
36+
checker = &Checker{}
37+
})
38+
return checker
39+
}
40+
41+
func GetChecker() monitor.LicenseChecker {
42+
return checker
43+
}
44+
45+
func (c *Checker) Init(cfg configs.Warrant) {
46+
}
47+
48+
func (c *Checker) HasObtained(function int) (bool, error) {
49+
return false, nil
50+
}
51+
52+
func (c *Checker) AgentHasObtained(agent *metadbmodel.VTap, function int) (bool, error) {
53+
return false, nil
54+
}

server/controller/recorder/domain.go

+19-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ package recorder
1818

1919
import (
2020
"context"
21-
"errors"
2221
"fmt"
2322
"strings"
2423
"time"
@@ -82,6 +81,10 @@ func (d *domain) CloseStatsd() {
8281

8382
func (d *domain) Refresh(target string, cloudData cloudmodel.Resource) error {
8483
log.Infof("refresh target: %s", target, d.metadata.LogPrefixes)
84+
if err := d.checkLicense(); err != nil {
85+
return err
86+
}
87+
8588
switch target {
8689
case RefreshTargetDomain:
8790
log.Info("refresher started, triggered by ticker/hand", d.metadata.LogPrefixes)
@@ -94,14 +97,28 @@ func (d *domain) Refresh(target string, cloudData cloudmodel.Resource) error {
9497
return d.subDomains.RefreshOne(cloudData.SubDomainResources)
9598
default:
9699
log.Info("invalid refresh target", d.metadata.LogPrefixes)
97-
return errors.New("invalid refresh target")
100+
return fmt.Errorf("invalid refresh target")
98101
}
99102
}
100103

101104
func (d *domain) refreshDomainExcludeSubDomain(cloudData cloudmodel.Resource) error {
102105
return d.tryRefresh(cloudData)
103106
}
104107

108+
func (d *domain) checkLicense() error {
109+
var domain *metadbmodel.Domain
110+
err := d.metadata.DB.Select("state").Where("lcuuid = ?", d.metadata.Domain.Lcuuid).First(&domain).Error
111+
if err != nil {
112+
log.Errorf("failed to get domain from db: %s", err, d.metadata.LogPrefixes)
113+
return err
114+
}
115+
if domain.State == common.RESOURCE_STATE_CODE_NO_LICENSE {
116+
log.Errorf("domain %s has no license", d.metadata.Domain.Lcuuid, d.metadata.LogPrefixes)
117+
return fmt.Errorf("domain %s has no license", d.metadata.Domain.Lcuuid)
118+
}
119+
return nil
120+
}
121+
105122
func (d *domain) tryRefresh(cloudData cloudmodel.Resource) error {
106123
// 无论是否会更新资源,需先更新domain及subdomain状态
107124
d.updateStateInfo(cloudData)

server/server.yaml

+7
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,12 @@ controller:
100100
port: 20823
101101
timeout: 30
102102

103+
warrant:
104+
enabled: false
105+
host: warrant
106+
port: 20413
107+
timeout: 30
108+
103109
# mysql相关配置
104110
mysql:
105111
enabled: true
@@ -217,6 +223,7 @@ controller:
217223
# lost_time_max: 3600
218224
# warrant
219225
warrant:
226+
enabled: false
220227
host: warrant
221228
port: 20413
222229
timeout: 30

0 commit comments

Comments
 (0)