blob: b8de0a9e0c44f01bebc71c085d890bf239e58a4a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 entity
import (
"reflect"
"time"
"github.com/apisix/manager-api/internal/utils"
)
type BaseInfo struct {
ID interface{} `json:"id"`
CreateTime int64 `json:"create_time,omitempty"`
UpdateTime int64 `json:"update_time,omitempty"`
}
func (info *BaseInfo) GetBaseInfo() *BaseInfo {
return info
}
func (info *BaseInfo) Creating() {
if info.ID == nil {
info.ID = utils.GetFlakeUidStr()
} else {
// convert to string if it's not
if reflect.TypeOf(info.ID).String() != "string" {
info.ID = utils.InterfaceToString(info.ID)
}
}
info.CreateTime = time.Now().Unix()
info.UpdateTime = time.Now().Unix()
}
func (info *BaseInfo) Updating(storedInfo *BaseInfo) {
info.ID = storedInfo.ID
info.CreateTime = storedInfo.CreateTime
info.UpdateTime = time.Now().Unix()
}
func (info *BaseInfo) KeyCompat(key string) {
if info.ID == nil && key != "" {
info.ID = key
}
}
type Status uint8
// swagger:model Route
type Route struct {
BaseInfo
URI string `json:"uri,omitempty"`
Uris []string `json:"uris,omitempty"`
Name string `json:"name"`
Desc string `json:"desc,omitempty"`
Priority int `json:"priority,omitempty"`
Methods []string `json:"methods,omitempty"`
Host string `json:"host,omitempty"`
Hosts []string `json:"hosts,omitempty"`
RemoteAddr string `json:"remote_addr,omitempty"`
RemoteAddrs []string `json:"remote_addrs,omitempty"`
Vars []interface{} `json:"vars,omitempty"`
FilterFunc string `json:"filter_func,omitempty"`
Script interface{} `json:"script,omitempty"`
ScriptID interface{} `json:"script_id,omitempty"` // For debug and optimization(cache), currently same as Route's ID
Plugins map[string]interface{} `json:"plugins,omitempty"`
PluginConfigID interface{} `json:"plugin_config_id,omitempty"`
Upstream *UpstreamDef `json:"upstream,omitempty"`
ServiceID interface{} `json:"service_id,omitempty"`
UpstreamID interface{} `json:"upstream_id,omitempty"`
ServiceProtocol string `json:"service_protocol,omitempty"`
Labels map[string]string `json:"labels,omitempty"`
EnableWebsocket bool `json:"enable_websocket,omitempty"`
Status Status `json:"status"`
}
// --- structures for upstream start ---
type TimeoutValue float32
type Timeout struct {
Connect TimeoutValue `json:"connect,omitempty"`
Send TimeoutValue `json:"send,omitempty"`
Read TimeoutValue `json:"read,omitempty"`
}
type Node struct {
Host string `json:"host,omitempty"`
Port int `json:"port,omitempty"`
Weight int `json:"weight"`
Metadata interface{} `json:"metadata,omitempty"`
Priority int `json:"priority,omitempty"`
}
type K8sInfo struct {
Namespace string `json:"namespace,omitempty"`
DeployName string `json:"deploy_name,omitempty"`
ServiceName string `json:"service_name,omitempty"`
Port int `json:"port,omitempty"`
BackendType string `json:"backend_type,omitempty"`
}
type Healthy struct {
Interval int `json:"interval,omitempty"`
HttpStatuses []int `json:"http_statuses,omitempty"`
Successes int `json:"successes,omitempty"`
}
type UnHealthy struct {
Interval int `json:"interval,omitempty"`
HTTPStatuses []int `json:"http_statuses,omitempty"`
TCPFailures int `json:"tcp_failures,omitempty"`
Timeouts int `json:"timeouts,omitempty"`
HTTPFailures int `json:"http_failures,omitempty"`
}
type Active struct {
Type string `json:"type,omitempty"`
Timeout TimeoutValue `json:"timeout,omitempty"`
Concurrency int `json:"concurrency,omitempty"`
Host string `json:"host,omitempty"`
Port int `json:"port,omitempty"`
HTTPPath string `json:"http_path,omitempty"`
HTTPSVerifyCertificate bool `json:"https_verify_certificate,omitempty"`
Healthy Healthy `json:"healthy,omitempty"`
UnHealthy UnHealthy `json:"unhealthy,omitempty"`
ReqHeaders []string `json:"req_headers,omitempty"`
}
type Passive struct {
Type string `json:"type,omitempty"`
Healthy Healthy `json:"healthy,omitempty"`
UnHealthy UnHealthy `json:"unhealthy,omitempty"`
}
type HealthChecker struct {
Active Active `json:"active,omitempty"`
Passive Passive `json:"passive,omitempty"`
}
type UpstreamTLS struct {
ClientCert string `json:"client_cert,omitempty"`
ClientKey string `json:"client_key,omitempty"`
}
type UpstreamKeepalivePool struct {
IdleTimeout *TimeoutValue `json:"idle_timeout,omitempty"`
Requests int `json:"requests,omitempty"`
Size int `json:"size"`
}
type UpstreamDef struct {
Nodes interface{} `json:"nodes,omitempty"`
Retries *int `json:"retries,omitempty"`
Timeout *Timeout `json:"timeout,omitempty"`
Type string `json:"type,omitempty"`
Checks interface{} `json:"checks,omitempty"`
HashOn string `json:"hash_on,omitempty"`
Key string `json:"key,omitempty"`
Scheme string `json:"scheme,omitempty"`
DiscoveryType string `json:"discovery_type,omitempty"`
DiscoveryArgs map[string]string `json:"discovery_args,omitempty"`
PassHost string `json:"pass_host,omitempty"`
UpstreamHost string `json:"upstream_host,omitempty"`
Name string `json:"name,omitempty"`
Desc string `json:"desc,omitempty"`
ServiceName string `json:"service_name,omitempty"`
Labels map[string]string `json:"labels,omitempty"`
TLS *UpstreamTLS `json:"tls,omitempty"`
KeepalivePool *UpstreamKeepalivePool `json:"keepalive_pool,omitempty"`
RetryTimeout TimeoutValue `json:"retry_timeout,omitempty"`
}
// swagger:model Upstream
type Upstream struct {
BaseInfo
UpstreamDef
}
type UpstreamNameResponse struct {
ID interface{} `json:"id"`
Name string `json:"name"`
}
func (upstream *Upstream) Parse2NameResponse() (*UpstreamNameResponse, error) {
nameResp := &UpstreamNameResponse{
ID: upstream.ID,
Name: upstream.Name,
}
return nameResp, nil
}
// --- structures for upstream end ---
// swagger:model Consumer
type Consumer struct {
Username string `json:"username"`
Desc string `json:"desc,omitempty"`
Plugins map[string]interface{} `json:"plugins,omitempty"`
Labels map[string]string `json:"labels,omitempty"`
CreateTime int64 `json:"create_time,omitempty"`
UpdateTime int64 `json:"update_time,omitempty"`
}
type SSLClient struct {
CA string `json:"ca,omitempty"`
Depth int `json:"depth,omitempty"`
}
// swagger:model SSL
type SSL struct {
BaseInfo
Cert string `json:"cert,omitempty"`
Key string `json:"key,omitempty"`
Sni string `json:"sni,omitempty"`
Snis []string `json:"snis,omitempty"`
Certs []string `json:"certs,omitempty"`
Keys []string `json:"keys,omitempty"`
ExpTime int64 `json:"exptime,omitempty"`
Status int `json:"status"`
ValidityStart int64 `json:"validity_start,omitempty"`
ValidityEnd int64 `json:"validity_end,omitempty"`
Labels map[string]string `json:"labels,omitempty"`
Client *SSLClient `json:"client,omitempty"`
}
// swagger:model Service
type Service struct {
BaseInfo
Name string `json:"name,omitempty"`
Desc string `json:"desc,omitempty"`
Upstream *UpstreamDef `json:"upstream,omitempty"`
UpstreamID interface{} `json:"upstream_id,omitempty"`
Plugins map[string]interface{} `json:"plugins,omitempty"`
Script string `json:"script,omitempty"`
Labels map[string]string `json:"labels,omitempty"`
EnableWebsocket bool `json:"enable_websocket,omitempty"`
Hosts []string `json:"hosts,omitempty"`
}
type Script struct {
ID string `json:"id"`
Script interface{} `json:"script,omitempty"`
}
type RequestValidation struct {
Type string `json:"type,omitempty"`
Required []string `json:"required,omitempty"`
Properties interface{} `json:"properties,omitempty"`
}
// swagger:model GlobalPlugins
type GlobalPlugins struct {
BaseInfo
Plugins map[string]interface{} `json:"plugins"`
}
type ServerInfo struct {
BaseInfo
LastReportTime int64 `json:"last_report_time,omitempty"`
UpTime int64 `json:"up_time,omitempty"`
BootTime int64 `json:"boot_time,omitempty"`
EtcdVersion string `json:"etcd_version,omitempty"`
Hostname string `json:"hostname,omitempty"`
Version string `json:"version,omitempty"`
}
// swagger:model GlobalPlugins
type PluginConfig struct {
BaseInfo
Desc string `json:"desc,omitempty"`
Plugins map[string]interface{} `json:"plugins"`
Labels map[string]string `json:"labels,omitempty"`
}
// swagger:model Proto
type Proto struct {
BaseInfo
Desc string `json:"desc,omitempty"`
Content string `json:"content"`
}
// swagger:model StreamRoute
type StreamRoute struct {
BaseInfo
Desc string `json:"desc,omitempty"`
RemoteAddr string `json:"remote_addr,omitempty"`
ServerAddr string `json:"server_addr,omitempty"`
ServerPort int `json:"server_port,omitempty"`
SNI string `json:"sni,omitempty"`
Upstream *UpstreamDef `json:"upstream,omitempty"`
UpstreamID interface{} `json:"upstream_id,omitempty"`
Plugins map[string]interface{} `json:"plugins,omitempty"`
}
// swagger:model SystemConfig
type SystemConfig struct {
ConfigName string `json:"config_name"`
Desc string `json:"desc,omitempty"`
Payload map[string]interface{} `json:"payload,omitempty"`
CreateTime int64 `json:"create_time,omitempty"`
UpdateTime int64 `json:"update_time,omitempty"`
}