func()

in oracle/controllers/exportcontroller/export_controller.go [136:208]


func (r *ExportReconciler) handleNotStartedExport(ctx context.Context, log logr.Logger, expWrapper *readyConditionWrapper, req ctrl.Request) (ctrl.Result, error) {
	var (
		db   = &v1alpha1.Database{}
		inst = &v1alpha1.Instance{}
		exp  = expWrapper.exp
	)

	// get referenced objects: database and instance
	dbKey := types.NamespacedName{
		Namespace: req.Namespace,
		Name:      exp.Spec.DatabaseName,
	}
	if err := r.Get(ctx, dbKey, db); err != nil {
		log.Error(err, "error getting database", "database", dbKey)
		return ctrl.Result{}, err
	}

	instKey := types.NamespacedName{
		Namespace: req.Namespace,
		Name:      exp.Spec.Instance,
	}
	if err := r.Get(ctx, instKey, inst); err != nil {
		log.Error(err, "error getting instance", "instance", instKey)
		return ctrl.Result{}, err
	}

	// validate
	if exp.Spec.Instance != db.Spec.Instance {
		return ctrl.Result{}, fmt.Errorf("instance names in Export and Database specs do not match:"+
			" %q != %q", exp.Spec.Instance, db.Spec.Instance)
	}
	if len(exp.Spec.ExportObjects) == 0 {
		return ctrl.Result{}, fmt.Errorf("no object to export, exportObjects: %v", exp.Spec.ExportObjects)
	}

	dbReady := k8s.ConditionStatusEquals(
		k8s.FindCondition(db.Status.Conditions, k8s.Ready),
		metav1.ConditionTrue)

	// if can start, begin export
	if dbReady {
		dataPumpExportReq := &controllers.DataPumpExportRequest{
			PdbName:       db.Spec.Name,
			DbDomain:      inst.Spec.DBDomain,
			ObjectType:    exp.Spec.ExportObjectType,
			Objects:       strings.Join(exp.Spec.ExportObjects, ","),
			GcsPath:       exp.Spec.GcsPath,
			GcsLogPath:    exp.Spec.GcsLogPath,
			LroInput:      &controllers.LROInput{OperationId: lroOperationID(exp)},
			FlashbackTime: getFlashbackTime(exp.Spec.FlashbackTime),
		}
		resp, err := controllers.DataPumpExport(ctx, r, r.DatabaseClientFactory, inst.Namespace, inst.Name, *dataPumpExportReq)

		if err != nil {
			if !controllers.IsAlreadyExistsError(err) {
				expWrapper.setState(k8s.ExportPending, fmt.Sprintf("failed to start export: %v", err))
				return ctrl.Result{}, fmt.Errorf("failed to start export: %v", err)

			}
			log.Info("Export operation was already running")
		} else {
			log.Info("started DataPumpExport operation", "response", resp)
		}

		// Export started successfully
		expWrapper.setState(k8s.ExportInProgress, "")

	} else {
		log.Info("database is not yet ready")
	}

	return requeueSoon, nil
}