in istioctl/pkg/verifier/verifier.go [261:388]
func (v *StatusVerifier) verifyPostInstall(visitor resource.Visitor, filename string) (int, int, error) {
crdCount := 0
istioDeploymentCount := 0
err := visitor.Visit(func(info *resource.Info, err error) error {
if err != nil {
return err
}
content, err := runtime.DefaultUnstructuredConverter.ToUnstructured(info.Object)
if err != nil {
return err
}
un := &unstructured.Unstructured{Object: content}
kind := un.GetKind()
name := un.GetName()
namespace := un.GetNamespace()
kinds := findResourceInSpec(un.GetObjectKind().GroupVersionKind())
if kinds == "" {
kinds = strings.ToLower(kind) + "s"
}
if namespace == "" {
namespace = v.istioNamespace
}
switch kind {
case "Deployment":
deployment := &appsv1.Deployment{}
err = info.Client.
Get().
Resource(kinds).
Namespace(namespace).
Name(name).
VersionedParams(&meta_v1.GetOptions{}, scheme.ParameterCodec).
Do(context.TODO()).
Into(deployment)
if err != nil {
v.reportFailure(kind, name, namespace, err)
return err
}
if err = verifyDeploymentStatus(deployment); err != nil {
ivf := istioVerificationFailureError(filename, err)
v.reportFailure(kind, name, namespace, ivf)
return ivf
}
if namespace == v.istioNamespace && strings.HasPrefix(name, "istio") {
istioDeploymentCount++
}
case "Job":
job := &v1batch.Job{}
err = info.Client.
Get().
Resource(kinds).
Namespace(namespace).
Name(name).
VersionedParams(&meta_v1.GetOptions{}, scheme.ParameterCodec).
Do(context.TODO()).
Into(job)
if err != nil {
v.reportFailure(kind, name, namespace, err)
return err
}
if err := verifyJobPostInstall(job); err != nil {
ivf := istioVerificationFailureError(filename, err)
v.reportFailure(kind, name, namespace, ivf)
return ivf
}
case "IstioOperator":
// It is not a problem if the cluster does not include the IstioOperator
// we are checking. Instead, verify the cluster has the things the
// IstioOperator specifies it should have.
// IstioOperator isn't part of pkg/config/schema/collections,
// usual conversion not available. Convert unstructured to string
// and ask operator code to unmarshal.
fixTimestampRelatedUnmarshalIssues(un)
by := util.ToYAML(un)
unmergedIOP, err := operator_istio.UnmarshalIstioOperator(by, true)
if err != nil {
v.reportFailure(kind, name, namespace, err)
return err
}
profile := manifest.GetProfile(unmergedIOP)
iop, err := manifest.GetMergedIOP(by, profile, v.manifestsPath, v.controlPlaneOpts.Revision,
v.client, v.logger)
if err != nil {
v.reportFailure(kind, name, namespace, err)
return err
}
if v.manifestsPath != "" {
iop.Spec.InstallPackagePath = v.manifestsPath
}
if v1alpha1.Namespace(iop.Spec) == "" {
v1alpha1.SetNamespace(iop.Spec, v.istioNamespace)
}
generatedCrds, generatedDeployments, err := v.verifyPostInstallIstioOperator(iop, filename)
crdCount += generatedCrds
istioDeploymentCount += generatedDeployments
if err != nil {
return err
}
default:
result := info.Client.
Get().
Resource(kinds).
Name(name).
Do(context.TODO())
if result.Error() != nil {
result = info.Client.
Get().
Resource(kinds).
Namespace(namespace).
Name(name).
Do(context.TODO())
if result.Error() != nil {
v.reportFailure(kind, name, namespace, result.Error())
return istioVerificationFailureError(filename,
fmt.Errorf("the required %s:%s is not ready due to: %v",
kind, name, result.Error()))
}
}
if kind == "CustomResourceDefinition" {
crdCount++
}
}
v.logger.LogAndPrintf("%s %s: %s.%s checked successfully", v.successMarker, kind, name, namespace)
return nil
})
return crdCount, istioDeploymentCount, err
}