blob: 5c564ea2bf2622f3cdba3a4153b723ef8e86c954 [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 errdict
import (
"strings"
)
import (
"istio.io/pkg/structured"
)
const (
LikelyCauseFirstPrefix = "The likely cause is "
LikeyCauseSecondPrefix = "Another possible cause could be "
)
// General boilerplate.
const (
// Boilerplate messages applicable all over the code base.
// Action
ActionIfErrPersistsCheckBugList = "If this error persists, " + ActionCheckBugList
ActionIfErrSureCorrectConfigContactSupport = "If you are sure your configuration is correct, " + ActionCheckBugList
ActionCheckBugList = "see https://istio.io/latest/about/bugs for possible solutions."
// LikelyCause
LikelyCauseAPIServer = "a problem with the Kubernetes API server"
LikelyCauseConfiguration = "an incorrect or badly formatted configuration"
LikelyCauseSoftwareBug = "an issue with the Istio code"
// Is the error permanent?
TransiencePermanentForInstall = "If the error occurred immediately after installation, it is likely permanent."
)
// Operator specific
const (
// Impact
OperatorImpactFailedToGetObjectFromAPIServer = "If the error is transient, the impact is low. If permanent, " +
"updates for the objects cannot be processed leading to an out of sync control plane."
OperatorImpactNoUpdates = "In this error state, changes to the IstioOperator CR will not result in the Istio " +
"control plane being updated."
)
var (
OperatorFailedToGetObjectFromAPIServer = &structured.Error{
MoreInfo: "Failed to get an object from the Kubernetes API server, because of a transient " +
"API server error or the object no longer exists.",
Impact: OperatorImpactFailedToGetObjectFromAPIServer,
LikelyCause: formatCauses(LikelyCauseAPIServer) + " " + TransiencePermanentForInstall,
Action: "If the error is because the object was deleted, it can be safely ignored. Otherwise, if the " +
"error persists, " + ActionCheckBugList,
}
OperatorFailedToGetObjectInCallback = &structured.Error{
MoreInfo: "A Kubernetes update for an IstioOperator resource did not " +
"contain an IstioOperator object.",
Impact: OperatorImpactNoUpdates,
LikelyCause: formatCauses(LikelyCauseAPIServer) + " " + TransiencePermanentForInstall,
Action: ActionIfErrPersistsCheckBugList,
}
OperatorFailedToAddFinalizer = &structured.Error{
MoreInfo: "A finalizer could not be added to the IstioOperator resource. The " +
"controller uses the finalizer to temporarily prevent the resource from being deleted while the Istio " +
"control plane is being deleted.",
Impact: "When the IstioOperator resource is deleted, the Istio control plane may " +
"not be fully removed.",
LikelyCause: formatCauses(LikelyCauseAPIServer),
Action: "Delete and re-add the IstioOperator resource. " + ActionIfErrPersistsCheckBugList,
}
OperatorFailedToRemoveFinalizer = &structured.Error{
MoreInfo: "The finalizer set by the operator controller could not be removed " +
"when the IstioOperator resource was deleted.",
Impact: "The IstioOperator resource can not be removed by the operator controller.",
LikelyCause: formatCauses(LikelyCauseAPIServer),
Action: "Remove the IstioOperator resource finalizer manually using kubectl edit.",
}
OperatorFailedToMergeUserIOP = &structured.Error{
MoreInfo: "The values in the selected spec.profile could not be merged with " +
"the user IstioOperator resource.",
Impact: "The operator controller cannot create and act upon the user " +
"defined IstioOperator resource. The Istio control plane will not be installed or updated.",
LikelyCause: formatCauses(LikelyCauseConfiguration, LikelyCauseSoftwareBug),
Action: "Check that the IstioOperator resource has the correct syntax. " +
ActionIfErrSureCorrectConfigContactSupport,
}
OperatorFailedToConfigure = &structured.Error{
MoreInfo: "the IstioOperator Resource could not be applied on the cluster " +
"because of incompatible Kubernetes settings",
Impact: OperatorImpactNoUpdates,
LikelyCause: formatCauses(LikelyCauseConfiguration),
Action: "Esnure that IstioOperator config is compatible with current Kubernetes version." +
ActionIfErrSureCorrectConfigContactSupport,
}
)
func fixFormat(s string) string {
s = strings.TrimSpace(s)
return strings.TrimSuffix(s, ".")
}
func formatCauses(causes ...string) string {
if len(causes) == 0 {
return ""
}
out := LikelyCauseFirstPrefix + fixFormat(causes[0]) + "."
for _, c := range causes[1:] {
out += LikeyCauseSecondPrefix + fixFormat(c) + "."
}
return out
}