1/*
2 *
3 * Copyright 2020 gRPC authors.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 */
18
19package lrs
20
21import (
22	"encoding/json"
23	"fmt"
24
25	internalserviceconfig "google.golang.org/grpc/internal/serviceconfig"
26	"google.golang.org/grpc/serviceconfig"
27	"google.golang.org/grpc/xds/internal"
28)
29
30// LBConfig is the balancer config for lrs balancer.
31type LBConfig struct {
32	serviceconfig.LoadBalancingConfig `json:"-"`
33
34	ClusterName             string                                `json:"clusterName,omitempty"`
35	EDSServiceName          string                                `json:"edsServiceName,omitempty"`
36	LoadReportingServerName string                                `json:"lrsLoadReportingServerName,omitempty"`
37	Locality                *internal.LocalityID                  `json:"locality,omitempty"`
38	ChildPolicy             *internalserviceconfig.BalancerConfig `json:"childPolicy,omitempty"`
39}
40
41func parseConfig(c json.RawMessage) (*LBConfig, error) {
42	var cfg LBConfig
43	if err := json.Unmarshal(c, &cfg); err != nil {
44		return nil, err
45	}
46	if cfg.ClusterName == "" {
47		return nil, fmt.Errorf("required ClusterName is not set in %+v", cfg)
48	}
49	if cfg.Locality == nil {
50		return nil, fmt.Errorf("required Locality is not set in %+v", cfg)
51	}
52	return &cfg, nil
53}
54