blob: 0bca19d0943870c0c2b92b5277cc86a24287575e [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 utils
import (
"net"
"regexp"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
k8stypes "k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/client"
"github.com/apache/apisix-ingress-controller/internal/types"
)
func NamespacedName(obj client.Object) k8stypes.NamespacedName {
return k8stypes.NamespacedName{
Namespace: obj.GetNamespace(),
Name: obj.GetName(),
}
}
func NamespacedNameKind(obj client.Object) types.NamespacedNameKind {
return types.NamespacedNameKind{
Namespace: obj.GetNamespace(),
Name: obj.GetName(),
Kind: obj.GetObjectKind().GroupVersionKind().Kind,
}
}
func ValidateRemoteAddrs(remoteAddrs []string) error {
for _, addr := range remoteAddrs {
if ip := net.ParseIP(addr); ip == nil {
// addr is not an IP address, try to parse it as a CIDR.
if _, _, err := net.ParseCIDR(addr); err != nil {
return err
}
}
}
return nil
}
var hostDef = "^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$"
var hostDefRegex = regexp.MustCompile(hostDef)
// MatchHostDef checks that host matches host's schema
// ref to : https://github.com/apache/apisix/blob/c5fc10d9355a0c177a7532f01c77745ff0639a7f/apisix/schema_def.lua#L40
// ref to : https://github.com/kubernetes/kubernetes/blob/976a940f4a4e84fe814583848f97b9aafcdb083f/staging/src/k8s.io/apimachinery/pkg/util/validation/validation.go#L205
// They define regex differently, but k8s's dns is more accurate
// todo: validate by CRD definition
func MatchHostDef(host string) bool {
return hostDefRegex.MatchString(host)
}
func AppendFunc[T any](s []T, keep func(v T) bool, values ...T) []T {
for _, v := range values {
if keep(v) {
s = append(s, v)
}
}
return s
}
func Filter[T any](s []T, keep func(v T) bool) []T {
return AppendFunc(make([]T, 0), keep, s...)
}
func IsSubsetOf(a, b map[string]string) bool {
if len(a) == 0 {
// Empty labels matches everything.
return true
}
for k, v := range a {
if vv, ok := b[k]; !ok || vv != v {
return false
}
}
return true
}
func ConditionStatus(status bool) metav1.ConditionStatus {
if status {
return metav1.ConditionTrue
}
return metav1.ConditionFalse
}