blob: 6402e60903515522b48a1231bcceefe1b6e52d77 [file] [log] [blame]
// Copyright Istio Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package mock
import (
"fmt"
"net"
"time"
)
import (
"github.com/apache/dubbo-go-pixiu/pilot/pkg/model"
"github.com/apache/dubbo-go-pixiu/pkg/cluster"
"github.com/apache/dubbo-go-pixiu/pkg/config/host"
"github.com/apache/dubbo-go-pixiu/pkg/config/protocol"
)
// PortHTTPName is the HTTP port name
var PortHTTPName = "http"
type ServiceArgs struct {
Hostname host.Name
Address string
ServiceAccounts []string
ClusterID cluster.ID
}
func MakeServiceInstance(service *model.Service, port *model.Port, version int, locality model.Locality) *model.ServiceInstance {
if service.External() {
return nil
}
// we make port 80 same as endpoint port, otherwise, it's distinct
target := port.Port
if target != 80 {
target += 1000
}
return &model.ServiceInstance{
Endpoint: &model.IstioEndpoint{
Address: MakeIP(service, version),
EndpointPort: uint32(target),
ServicePortName: port.Name,
Labels: map[string]string{"version": fmt.Sprintf("v%d", version)},
Locality: locality,
},
Service: service,
ServicePort: port,
}
}
// MakeService creates a memory service
func MakeService(args ServiceArgs) *model.Service {
return &model.Service{
CreationTime: time.Now(),
Hostname: args.Hostname,
ClusterVIPs: model.AddressMap{
Addresses: map[cluster.ID][]string{args.ClusterID: {args.Address}},
},
DefaultAddress: args.Address,
ServiceAccounts: args.ServiceAccounts,
Ports: []*model.Port{
{
Name: PortHTTPName,
Port: 80, // target port 80
Protocol: protocol.HTTP,
}, {
Name: "http-status",
Port: 81, // target port 1081
Protocol: protocol.HTTP,
}, {
Name: "custom",
Port: 90, // target port 1090
Protocol: protocol.TCP,
}, {
Name: "mongo",
Port: 100, // target port 1100
Protocol: protocol.Mongo,
}, {
Name: "redis",
Port: 110, // target port 1110
Protocol: protocol.Redis,
}, {
Name: "mysql",
Port: 120, // target port 1120
Protocol: protocol.MySQL,
},
},
}
}
// MakeExternalHTTPService creates memory external service
func MakeExternalHTTPService(hostname host.Name, isMeshExternal bool, address string) *model.Service {
return &model.Service{
CreationTime: time.Now(),
Hostname: hostname,
DefaultAddress: address,
MeshExternal: isMeshExternal,
Ports: []*model.Port{{
Name: "http",
Port: 80,
Protocol: protocol.HTTP,
}},
}
}
// MakeExternalHTTPSService creates memory external service
func MakeExternalHTTPSService(hostname host.Name, isMeshExternal bool, address string) *model.Service {
return &model.Service{
CreationTime: time.Now(),
Hostname: hostname,
DefaultAddress: address,
MeshExternal: isMeshExternal,
Ports: []*model.Port{{
Name: "https",
Port: 443,
Protocol: protocol.HTTPS,
}},
}
}
// MakeIP creates a fake IP address for a service and instance version
func MakeIP(service *model.Service, version int) string {
// external services have no instances
if service.External() {
return ""
}
ip := net.ParseIP(service.DefaultAddress).To4()
ip[2] = byte(1)
ip[3] = byte(version)
return ip.String()
}
type Controller struct {
serviceHandler model.ControllerHandlers
}
func (c *Controller) AppendServiceHandler(f func(*model.Service, model.Event)) {
c.serviceHandler.AppendServiceHandler(f)
}
func (c *Controller) AppendWorkloadHandler(func(*model.WorkloadInstance, model.Event)) {}
func (c *Controller) Run(<-chan struct{}) {}
func (c *Controller) HasSynced() bool { return true }
func (c *Controller) OnServiceEvent(s *model.Service, e model.Event) {
for _, h := range c.serviceHandler.GetServiceHandlers() {
h(s, e)
}
}