2018-11-21 15:04:03 +08:00
|
|
|
// RAINBOND, Application Management Platform
|
|
|
|
// Copyright (C) 2014-2017 Goodrain Co., Ltd.
|
|
|
|
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version. For any non-GPL usage of Rainbond,
|
|
|
|
// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd.
|
|
|
|
// must be obtained first.
|
|
|
|
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
package handler
|
|
|
|
|
|
|
|
import (
|
2018-11-26 18:08:16 +08:00
|
|
|
"context"
|
2018-11-21 17:15:40 +08:00
|
|
|
"fmt"
|
2018-11-26 18:08:16 +08:00
|
|
|
"github.com/Sirupsen/logrus"
|
|
|
|
api_db "github.com/goodrain/rainbond/api/db"
|
2018-11-21 15:04:03 +08:00
|
|
|
apimodel "github.com/goodrain/rainbond/api/model"
|
|
|
|
"github.com/goodrain/rainbond/db"
|
|
|
|
"github.com/goodrain/rainbond/db/model"
|
2018-11-26 18:08:16 +08:00
|
|
|
"github.com/goodrain/rainbond/mq/api/grpc/client"
|
2018-11-21 15:04:03 +08:00
|
|
|
"github.com/goodrain/rainbond/util"
|
|
|
|
"github.com/jinzhu/gorm"
|
2018-11-26 18:08:16 +08:00
|
|
|
"github.com/pquerna/ffjson/ffjson"
|
2018-11-26 02:19:08 +08:00
|
|
|
"os"
|
|
|
|
"strconv"
|
2018-11-21 15:04:03 +08:00
|
|
|
)
|
|
|
|
|
2018-11-26 02:19:08 +08:00
|
|
|
// GatewayAction -
|
2018-11-21 15:04:03 +08:00
|
|
|
type GatewayAction struct {
|
|
|
|
dbmanager db.Manager
|
|
|
|
}
|
|
|
|
|
2018-11-26 02:19:08 +08:00
|
|
|
//CreateGatewayManager creates gateway manager.
|
2018-11-21 15:04:03 +08:00
|
|
|
func CreateGatewayManager(dbmanager db.Manager) *GatewayAction {
|
|
|
|
return &GatewayAction{
|
|
|
|
dbmanager: dbmanager,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-11-26 02:19:08 +08:00
|
|
|
// AddHTTPRule adds http rule to db if it doesn't exists.
|
|
|
|
func (g *GatewayAction) AddHTTPRule(req *apimodel.AddHTTPRuleStruct) error {
|
2018-11-23 20:39:34 +08:00
|
|
|
httpRule := &model.HTTPRule{
|
2018-11-25 21:21:34 +08:00
|
|
|
UUID: req.HTTPRuleID,
|
2018-11-22 10:38:55 +08:00
|
|
|
ServiceID: req.ServiceID,
|
|
|
|
ContainerPort: req.ContainerPort,
|
|
|
|
Domain: req.Domain,
|
|
|
|
Path: req.Path,
|
|
|
|
Header: req.Header,
|
|
|
|
Cookie: req.Cookie,
|
|
|
|
IP: req.IP,
|
|
|
|
CertificateID: req.CertificateID,
|
2018-11-22 09:34:00 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// begin transaction
|
|
|
|
tx := db.GetManager().Begin()
|
|
|
|
if err := db.GetManager().HttpRuleDaoTransactions(tx).AddModel(httpRule); err != nil {
|
|
|
|
tx.Rollback()
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
cert := &model.Certificate{
|
|
|
|
UUID: req.CertificateID,
|
2018-11-25 21:21:34 +08:00
|
|
|
CertificateName: fmt.Sprintf("cert-%s", util.NewUUID()[0:8]),
|
2018-11-22 09:34:00 +08:00
|
|
|
Certificate: req.Certificate,
|
|
|
|
PrivateKey: req.PrivateKey,
|
|
|
|
}
|
|
|
|
if err := db.GetManager().CertificateDaoTransactions(tx).AddModel(cert); err != nil {
|
|
|
|
tx.Rollback()
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, ruleExtension := range req.RuleExtensions {
|
|
|
|
re := &model.RuleExtension{
|
2018-11-22 10:38:55 +08:00
|
|
|
UUID: util.NewUUID(),
|
2018-11-22 09:34:00 +08:00
|
|
|
RuleID: httpRule.UUID,
|
2018-11-22 10:38:55 +08:00
|
|
|
Key: ruleExtension.Key,
|
|
|
|
Value: ruleExtension.Value,
|
2018-11-22 09:34:00 +08:00
|
|
|
}
|
|
|
|
if err := db.GetManager().RuleExtensionDaoTransactions(tx).AddModel(re); err != nil {
|
|
|
|
tx.Rollback()
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// end transaction
|
|
|
|
if err := tx.Commit().Error; err != nil {
|
|
|
|
tx.Rollback()
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return nil
|
2018-11-21 15:04:03 +08:00
|
|
|
}
|
|
|
|
|
2018-11-26 02:19:08 +08:00
|
|
|
// UpdateHTTPRule updates http rule
|
|
|
|
func (g *GatewayAction) UpdateHTTPRule(req *apimodel.UpdateHTTPRuleStruct) error {
|
2018-11-22 10:38:55 +08:00
|
|
|
tx := db.GetManager().Begin()
|
2018-11-25 21:21:34 +08:00
|
|
|
rule, err := g.dbmanager.HttpRuleDaoTransactions(tx).GetHttpRuleByID(req.HTTPRuleID)
|
2018-11-21 17:15:40 +08:00
|
|
|
if err != nil {
|
2018-11-22 09:34:00 +08:00
|
|
|
tx.Rollback()
|
|
|
|
return err
|
2018-11-21 17:15:40 +08:00
|
|
|
}
|
|
|
|
if rule == nil {
|
2018-11-22 09:34:00 +08:00
|
|
|
tx.Rollback()
|
2018-11-25 21:21:34 +08:00
|
|
|
return fmt.Errorf("HTTPRule dosen't exist based on uuid(%s)", req.HTTPRuleID)
|
2018-11-21 17:15:40 +08:00
|
|
|
}
|
2018-11-25 21:59:25 +08:00
|
|
|
if rule.CertificateID != "" {
|
|
|
|
// delete old Certificate
|
|
|
|
if err := g.dbmanager.CertificateDaoTransactions(tx).DeleteCertificateByID(rule.CertificateID); err != nil {
|
|
|
|
tx.Rollback()
|
|
|
|
return err
|
2018-11-22 09:34:00 +08:00
|
|
|
}
|
2018-11-25 21:59:25 +08:00
|
|
|
// add new certificate
|
|
|
|
cert := &model.Certificate{
|
|
|
|
UUID: req.CertificateID,
|
|
|
|
CertificateName: fmt.Sprintf("cert-%s", util.NewUUID()[0:8]),
|
|
|
|
Certificate: req.Certificate,
|
|
|
|
PrivateKey: req.PrivateKey,
|
|
|
|
}
|
|
|
|
if err := g.dbmanager.CertificateDaoTransactions(tx).AddModel(cert); err != nil {
|
|
|
|
tx.Rollback()
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
rule.CertificateID = req.CertificateID
|
|
|
|
}
|
|
|
|
if len(req.RuleExtensions) > 0 {
|
|
|
|
// delete old RuleExtensions
|
|
|
|
if err := g.dbmanager.RuleExtensionDaoTransactions(tx).DeleteRuleExtensionByRuleID(rule.UUID); err != nil {
|
2018-11-22 09:34:00 +08:00
|
|
|
tx.Rollback()
|
|
|
|
return err
|
|
|
|
}
|
2018-11-25 21:59:25 +08:00
|
|
|
// add new rule extensions
|
|
|
|
for _, ruleExtension := range req.RuleExtensions {
|
|
|
|
re := &model.RuleExtension{
|
|
|
|
UUID: util.NewUUID(),
|
|
|
|
RuleID: rule.UUID,
|
|
|
|
Key: ruleExtension.Key,
|
|
|
|
Value: ruleExtension.Value,
|
|
|
|
}
|
|
|
|
if err := db.GetManager().RuleExtensionDaoTransactions(tx).AddModel(re); err != nil {
|
|
|
|
tx.Rollback()
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
2018-11-22 09:34:00 +08:00
|
|
|
}
|
|
|
|
// update http rule
|
2018-11-25 21:59:25 +08:00
|
|
|
if req.ServiceID != "" {
|
|
|
|
rule.ServiceID = req.ServiceID
|
|
|
|
}
|
|
|
|
if req.ContainerPort != 0 {
|
|
|
|
rule.ContainerPort = req.ContainerPort
|
|
|
|
}
|
|
|
|
if req.Domain != "" {
|
|
|
|
rule.Domain = req.Domain
|
|
|
|
}
|
|
|
|
if req.Path != "" {
|
|
|
|
rule.Path = req.Path
|
|
|
|
}
|
|
|
|
if req.Header != "" {
|
|
|
|
rule.Header = req.Header
|
|
|
|
}
|
|
|
|
if req.Cookie != "" {
|
|
|
|
rule.Cookie = req.Cookie
|
|
|
|
}
|
|
|
|
if req.IP != "" {
|
|
|
|
rule.IP = req.IP
|
|
|
|
}
|
2018-11-22 09:34:00 +08:00
|
|
|
if err := db.GetManager().HttpRuleDaoTransactions(tx).UpdateModel(rule); err != nil {
|
|
|
|
tx.Rollback()
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
// end transaction
|
|
|
|
if err := tx.Commit().Error; err != nil {
|
|
|
|
tx.Rollback()
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return nil
|
2018-11-21 17:15:40 +08:00
|
|
|
}
|
|
|
|
|
2018-11-26 02:19:08 +08:00
|
|
|
// DeleteHTTPRule deletes http rule, including certificate and rule extensions
|
|
|
|
func (g *GatewayAction) DeleteHTTPRule(req *apimodel.DeleteHTTPRuleStruct) error {
|
2018-11-21 17:57:48 +08:00
|
|
|
// begin transaction
|
|
|
|
tx := db.GetManager().Begin()
|
|
|
|
// delete http rule
|
2018-11-25 21:21:34 +08:00
|
|
|
httpRule, err := g.dbmanager.HttpRuleDaoTransactions(tx).GetHttpRuleByID(req.HTTPRuleID)
|
2018-11-21 17:57:48 +08:00
|
|
|
if err != nil {
|
|
|
|
tx.Rollback()
|
|
|
|
return err
|
|
|
|
}
|
2018-11-22 09:34:00 +08:00
|
|
|
if err := g.dbmanager.HttpRuleDaoTransactions(tx).DeleteHttpRuleByID(httpRule.UUID); err != nil {
|
|
|
|
tx.Rollback()
|
|
|
|
return err
|
|
|
|
}
|
2018-11-21 17:57:48 +08:00
|
|
|
// delete certificate
|
|
|
|
if err := g.dbmanager.CertificateDaoTransactions(tx).DeleteCertificateByID(httpRule.CertificateID); err != nil {
|
|
|
|
tx.Rollback()
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
// delete rule extension
|
|
|
|
if err := g.dbmanager.RuleExtensionDaoTransactions(tx).DeleteRuleExtensionByRuleID(httpRule.UUID); err != nil {
|
|
|
|
tx.Rollback()
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
// end transaction
|
|
|
|
if err := tx.Commit().Error; err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2018-11-21 17:15:40 +08:00
|
|
|
// AddCertificate adds certificate to db if it doesn't exists
|
2018-11-25 21:59:25 +08:00
|
|
|
func (g *GatewayAction) AddCertificate(req *apimodel.AddHTTPRuleStruct, tx *gorm.DB) error {
|
2018-11-21 17:15:40 +08:00
|
|
|
cert := &model.Certificate{
|
2018-11-21 17:57:48 +08:00
|
|
|
UUID: req.CertificateID,
|
2018-11-25 21:21:34 +08:00
|
|
|
CertificateName: fmt.Sprintf("cert-%s", util.NewUUID()[0:8]),
|
2018-11-21 17:57:48 +08:00
|
|
|
Certificate: req.Certificate,
|
|
|
|
PrivateKey: req.PrivateKey,
|
2018-11-21 17:15:40 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
return g.dbmanager.CertificateDaoTransactions(tx).AddModel(cert)
|
|
|
|
}
|
|
|
|
|
2018-11-26 02:19:08 +08:00
|
|
|
// UpdateCertificate updates certificate for http rule
|
2018-11-25 21:59:25 +08:00
|
|
|
func (g *GatewayAction) UpdateCertificate(req apimodel.AddHTTPRuleStruct, httpRule *model.HTTPRule,
|
2018-11-21 19:51:40 +08:00
|
|
|
tx *gorm.DB) error {
|
2018-11-21 17:15:40 +08:00
|
|
|
// delete old certificate
|
|
|
|
cert, err := g.dbmanager.CertificateDaoTransactions(tx).GetCertificateByID(req.CertificateID)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
if cert == nil {
|
|
|
|
return fmt.Errorf("Certificate doesn't exist based on certificateID(%s)", req.CertificateID)
|
|
|
|
}
|
|
|
|
|
2018-11-25 21:21:34 +08:00
|
|
|
cert.CertificateName = fmt.Sprintf("cert-%s", util.NewUUID()[0:8])
|
2018-11-21 17:15:40 +08:00
|
|
|
cert.Certificate = req.Certificate
|
|
|
|
cert.PrivateKey = req.PrivateKey
|
|
|
|
return g.dbmanager.CertificateDaoTransactions(tx).UpdateModel(cert)
|
2018-11-21 15:04:03 +08:00
|
|
|
}
|
|
|
|
|
2018-11-26 02:19:08 +08:00
|
|
|
// AddTCPRule adds tcp rule.
|
2018-11-26 09:50:15 +08:00
|
|
|
func (g *GatewayAction) AddTCPRule(req *apimodel.AddTCPRuleStruct) error {
|
2018-11-26 02:36:38 +08:00
|
|
|
// begin transaction
|
|
|
|
tx := db.GetManager().Begin()
|
|
|
|
// add port
|
|
|
|
port := &model.TenantServiceLBMappingPort{
|
2018-11-26 11:30:58 +08:00
|
|
|
ServiceID: req.ServiceID,
|
|
|
|
Port: req.Port,
|
2018-11-26 02:36:38 +08:00
|
|
|
ContainerPort: req.ContainerPort,
|
|
|
|
}
|
|
|
|
err := g.dbmanager.TenantServiceLBMappingPortDaoTransactions(tx).AddModel(port)
|
|
|
|
if err != nil {
|
|
|
|
tx.Rollback()
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
// add tcp rule
|
2018-11-23 20:39:34 +08:00
|
|
|
tcpRule := &model.TCPRule{
|
2018-11-25 21:21:34 +08:00
|
|
|
UUID: req.TCPRuleID,
|
2018-11-22 10:38:55 +08:00
|
|
|
ServiceID: req.ServiceID,
|
|
|
|
ContainerPort: req.ContainerPort,
|
|
|
|
IP: req.IP,
|
|
|
|
Port: req.Port,
|
2018-11-21 19:51:40 +08:00
|
|
|
}
|
|
|
|
if err := g.dbmanager.TcpRuleDaoTransactions(tx).AddModel(tcpRule); err != nil {
|
2018-11-21 20:14:13 +08:00
|
|
|
tx.Rollback()
|
2018-11-21 19:51:40 +08:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
// add rule extensions
|
|
|
|
for _, ruleExtension := range req.RuleExtensions {
|
|
|
|
re := &model.RuleExtension{
|
2018-11-21 20:14:13 +08:00
|
|
|
UUID: util.NewUUID(),
|
|
|
|
RuleID: tcpRule.UUID,
|
|
|
|
Value: ruleExtension.Value,
|
|
|
|
}
|
|
|
|
if err := g.dbmanager.RuleExtensionDaoTransactions(tx).AddModel(re); err != nil {
|
|
|
|
tx.Rollback()
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// end transaction
|
|
|
|
if err := tx.Commit().Error; err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2018-11-26 02:19:08 +08:00
|
|
|
// UpdateTCPRule updates a tcp rule
|
2018-11-26 11:30:58 +08:00
|
|
|
func (g *GatewayAction) UpdateTCPRule(req *apimodel.UpdateTCPRuleStruct) error {
|
2018-11-21 20:14:13 +08:00
|
|
|
// begin transaction
|
|
|
|
tx := db.GetManager().Begin()
|
|
|
|
// get old tcp rule
|
2018-11-25 21:21:34 +08:00
|
|
|
tcpRule, err := g.dbmanager.TcpRuleDaoTransactions(tx).GetTcpRuleByID(req.TCPRuleID)
|
2018-11-21 20:14:13 +08:00
|
|
|
if err != nil {
|
|
|
|
tx.Rollback()
|
|
|
|
return err
|
|
|
|
}
|
2018-11-26 11:30:58 +08:00
|
|
|
if len(req.RuleExtensions) > 0 {
|
|
|
|
// delete old rule extensions
|
|
|
|
if err := g.dbmanager.RuleExtensionDaoTransactions(tx).DeleteRuleExtensionByRuleID(tcpRule.UUID); err != nil {
|
|
|
|
tx.Rollback()
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
// add new rule extensions
|
|
|
|
for _, ruleExtension := range req.RuleExtensions {
|
|
|
|
re := &model.RuleExtension{
|
|
|
|
UUID: util.NewUUID(),
|
|
|
|
RuleID: tcpRule.UUID,
|
|
|
|
Value: ruleExtension.Value,
|
|
|
|
}
|
|
|
|
if err := g.dbmanager.RuleExtensionDaoTransactions(tx).AddModel(re); err != nil {
|
|
|
|
tx.Rollback()
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
2018-11-21 20:14:13 +08:00
|
|
|
}
|
|
|
|
// update tcp rule
|
2018-11-26 11:30:58 +08:00
|
|
|
if req.ServiceID != "" {
|
|
|
|
tcpRule.ServiceID = req.ServiceID
|
2018-11-21 20:14:13 +08:00
|
|
|
}
|
2018-11-26 11:30:58 +08:00
|
|
|
if req.ContainerPort != 0 {
|
|
|
|
tcpRule.ContainerPort = req.ContainerPort
|
|
|
|
}
|
|
|
|
if req.IP != "" {
|
|
|
|
tcpRule.IP = req.IP
|
|
|
|
}
|
|
|
|
if req.Port > 20000 {
|
|
|
|
// get old port
|
|
|
|
port, err := g.dbmanager.TenantServiceLBMappingPortDaoTransactions(tx).GetLBMappingPortByServiceIDAndPort(
|
|
|
|
tcpRule.ServiceID, tcpRule.Port)
|
|
|
|
if err != nil {
|
|
|
|
tx.Rollback()
|
|
|
|
return err
|
2018-11-21 19:51:40 +08:00
|
|
|
}
|
2018-11-26 11:30:58 +08:00
|
|
|
// check
|
|
|
|
// update port
|
|
|
|
port.Port = req.Port
|
|
|
|
if err := g.dbmanager.TenantServiceLBMappingPortDaoTransactions(tx).UpdateModel(port); err != nil {
|
2018-11-21 20:14:13 +08:00
|
|
|
tx.Rollback()
|
2018-11-21 19:51:40 +08:00
|
|
|
return err
|
|
|
|
}
|
2018-11-26 11:30:58 +08:00
|
|
|
tcpRule.Port = req.Port
|
|
|
|
}
|
|
|
|
if err := g.dbmanager.TcpRuleDaoTransactions(tx).UpdateModel(tcpRule); err != nil {
|
|
|
|
tx.Rollback()
|
|
|
|
return err
|
2018-11-21 19:51:40 +08:00
|
|
|
}
|
|
|
|
// end transaction
|
|
|
|
if err := tx.Commit().Error; err != nil {
|
2018-11-21 20:14:13 +08:00
|
|
|
tx.Rollback()
|
2018-11-21 19:51:40 +08:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2018-11-26 02:19:08 +08:00
|
|
|
// DeleteTCPRule deletes a tcp rule
|
2018-11-26 11:39:01 +08:00
|
|
|
func (g *GatewayAction) DeleteTCPRule(req *apimodel.DeleteTCPRuleStruct) error {
|
2018-11-21 20:33:37 +08:00
|
|
|
// begin transaction
|
|
|
|
tx := db.GetManager().Begin()
|
2018-11-25 21:21:34 +08:00
|
|
|
tcpRule, err := db.GetManager().TcpRuleDaoTransactions(tx).GetTcpRuleByID(req.TCPRuleID)
|
2018-11-21 20:33:37 +08:00
|
|
|
if err != nil {
|
|
|
|
tx.Rollback()
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
// delete rule extensions
|
|
|
|
if err := db.GetManager().RuleExtensionDaoTransactions(tx).DeleteRuleExtensionByRuleID(tcpRule.UUID); err != nil {
|
|
|
|
tx.Rollback()
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
// delete tcp rule
|
|
|
|
if err := db.GetManager().TcpRuleDaoTransactions(tx).DeleteTcpRule(tcpRule); err != nil {
|
|
|
|
tx.Rollback()
|
|
|
|
return err
|
|
|
|
}
|
2018-11-26 18:13:13 +08:00
|
|
|
// delete LBMappingPort
|
|
|
|
err = db.GetManager().TenantServiceLBMappingPortDaoTransactions(tx).DELServiceLBMappingPortByServiceIDAndPort(
|
|
|
|
tcpRule.ServiceID, tcpRule.Port)
|
|
|
|
if err != nil {
|
|
|
|
tx.Rollback()
|
|
|
|
return err
|
|
|
|
}
|
2018-11-21 20:33:37 +08:00
|
|
|
// end transaction
|
|
|
|
if err := tx.Commit().Error; err != nil {
|
|
|
|
tx.Rollback()
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2018-11-21 17:15:40 +08:00
|
|
|
// AddRuleExtensions adds rule extensions to db if any of they doesn't exists
|
2018-11-21 19:51:40 +08:00
|
|
|
func (g *GatewayAction) AddRuleExtensions(ruleID string, ruleExtensions []*apimodel.RuleExtensionStruct,
|
|
|
|
tx *gorm.DB) error {
|
2018-11-21 15:04:03 +08:00
|
|
|
for _, ruleExtension := range ruleExtensions {
|
|
|
|
re := &model.RuleExtension{
|
|
|
|
UUID: util.NewUUID(),
|
|
|
|
RuleID: ruleID,
|
|
|
|
Value: ruleExtension.Value,
|
|
|
|
}
|
|
|
|
err := g.dbmanager.RuleExtensionDaoTransactions(tx).AddModel(re)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
2018-11-26 02:19:08 +08:00
|
|
|
|
|
|
|
// GetAvailablePort returns a available port
|
|
|
|
func (g *GatewayAction) GetAvailablePort() (int, error) {
|
|
|
|
mapPorts, err := g.dbmanager.TenantServiceLBMappingPortDao().GetLBPortsASC()
|
|
|
|
if err != nil {
|
|
|
|
return 0, err
|
|
|
|
}
|
|
|
|
var ports []int
|
|
|
|
for _, p := range mapPorts {
|
|
|
|
ports = append(ports, p.Port)
|
|
|
|
}
|
|
|
|
maxPort, _ := strconv.Atoi(os.Getenv("MIN_LB_PORT"))
|
|
|
|
minPort, _ := strconv.Atoi(os.Getenv("MAX_LB_PORT"))
|
|
|
|
if minPort == 0 {
|
|
|
|
minPort = 20001
|
|
|
|
}
|
|
|
|
if maxPort == 0 {
|
|
|
|
maxPort = 35000
|
|
|
|
}
|
|
|
|
var maxUsePort int
|
|
|
|
if len(ports) > 0 {
|
|
|
|
maxUsePort = ports[len(ports)-1]
|
|
|
|
} else {
|
|
|
|
maxUsePort = 20001
|
|
|
|
}
|
|
|
|
//顺序分配端口
|
|
|
|
selectPort := maxUsePort + 1
|
|
|
|
if selectPort <= maxPort {
|
|
|
|
return selectPort, nil
|
|
|
|
}
|
|
|
|
//捡漏以前端口
|
|
|
|
selectPort = minPort
|
|
|
|
for _, p := range ports {
|
|
|
|
if p == selectPort {
|
|
|
|
selectPort = selectPort + 1
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
if p > selectPort {
|
|
|
|
return selectPort, nil
|
|
|
|
}
|
|
|
|
selectPort = selectPort + 1
|
|
|
|
}
|
|
|
|
if selectPort <= maxPort {
|
|
|
|
return selectPort, nil
|
|
|
|
}
|
|
|
|
return 0, fmt.Errorf("no more lb port can be use,max port is %d", maxPort)
|
|
|
|
}
|
2018-11-26 11:30:58 +08:00
|
|
|
|
|
|
|
// PortExists returns if the port exists
|
|
|
|
func (g *GatewayAction) PortExists(port int) bool {
|
|
|
|
return g.dbmanager.TenantServiceLBMappingPortDao().PortExists(port)
|
|
|
|
}
|
2018-11-26 18:08:16 +08:00
|
|
|
|
|
|
|
func (g *GatewayAction) SendTask(ruleID string, ruleType string, mqClient *client.MQClient) {
|
|
|
|
logrus.Info("sending apply_rule task...")
|
|
|
|
// get serviceID
|
|
|
|
var serviceID string
|
|
|
|
switch ruleType {
|
|
|
|
case "http":
|
|
|
|
rule, _ := g.dbmanager.HttpRuleDao().GetHttpRuleByID(ruleID)
|
|
|
|
serviceID = rule.ServiceID
|
|
|
|
case "tcp":
|
|
|
|
rule, _ := g.dbmanager.TcpRuleDao().GetTcpRuleByID(ruleID)
|
|
|
|
serviceID = rule.ServiceID
|
|
|
|
default:
|
|
|
|
logrus.Errorf("Unsupported rule type: %s", ruleType)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
// get service
|
|
|
|
service, err := g.dbmanager.TenantServiceDao().GetServiceByID(serviceID)
|
|
|
|
if err != nil {
|
|
|
|
logrus.Errorf("Unexpected error occurred while getting Service by ServiceID(%s): %v", serviceID, err)
|
|
|
|
}
|
|
|
|
body := make(map[string]interface{})
|
|
|
|
body["service_id"] = serviceID
|
|
|
|
body["deploy_version"] = service.DeployVersion
|
|
|
|
err = g.sendTask(body, "apply_rule", mqClient)
|
|
|
|
if err != nil {
|
|
|
|
logrus.Errorf("Unexpected error occurred while sending task: %v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (g *GatewayAction) sendTask(body map[string]interface{}, taskType string, mqClient *client.MQClient) error {
|
|
|
|
bodyJ, err := ffjson.Marshal(body)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
bs := &api_db.BuildTaskStruct{
|
|
|
|
TaskType: taskType,
|
|
|
|
TaskBody: bodyJ,
|
|
|
|
User: "define",
|
|
|
|
}
|
|
|
|
eq, errEq := api_db.BuildTaskBuild(bs)
|
|
|
|
if errEq != nil {
|
|
|
|
logrus.Errorf("build equeue stop request error, %v", errEq)
|
|
|
|
return errEq
|
|
|
|
}
|
|
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
|
|
_, err = mqClient.Enqueue(ctx, eq)
|
|
|
|
cancel()
|
|
|
|
if err != nil {
|
|
|
|
logrus.Errorf("equque mq error, %v", err)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|