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
}