blob: 441f83567cefb57a7c479b64e471e27248624294 [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 mesh
import (
"fmt"
"time"
)
import (
"github.com/apache/dubbo-go-pixiu/pkg/test/loadbalancersim/locality"
"github.com/apache/dubbo-go-pixiu/pkg/test/loadbalancersim/network"
"github.com/apache/dubbo-go-pixiu/pkg/test/loadbalancersim/timer"
)
type RouteKey struct {
Src locality.Instance
Dest locality.Instance
}
type Settings struct {
NetworkLatencies map[RouteKey]time.Duration
}
type Instance struct {
nodes Nodes
clients []*Client
s Settings
networkQ *timer.Queue
}
func New(s Settings) *Instance {
return &Instance{
s: s,
networkQ: timer.NewQueue(),
}
}
func (m *Instance) Nodes() Nodes {
return m.nodes
}
func (m *Instance) Clients() []*Client {
return m.clients
}
func (m *Instance) NewConnection(src *Client, dest *Node) network.Connection {
// Lookup the route between the source and destination
networkLatency := m.s.NetworkLatencies[RouteKey{
Src: src.Locality(),
Dest: dest.Locality(),
}]
request := dest.Request
if networkLatency > time.Duration(0) {
request = func(onDone func()) {
m.networkQ.Schedule(func() {
dest.Request(onDone)
}, time.Now().Add(networkLatency))
}
}
return network.NewConnection(dest.Name(), request)
}
func (m *Instance) ShutDown() {
m.networkQ.ShutDown()
m.nodes.ShutDown()
}
func (m *Instance) NewNodes(count int, serviceTime time.Duration, enableQueueLatency bool, locality locality.Instance) Nodes {
out := make(Nodes, 0, count)
for i := 0; i < count; i++ {
name := fmt.Sprintf("%s_%d", locality, i)
out = append(out, newNode(name, serviceTime, enableQueueLatency, locality))
}
m.nodes = append(m.nodes, out...)
return out
}
func (m *Instance) NewClient(s ClientSettings) *Client {
c := &Client{
mesh: m,
s: s,
}
m.clients = append(m.clients, c)
return c
}