VirtualBox

Ignore:
Timestamp:
May 7, 2019 11:03:49 AM (6 years ago)
Author:
vboxsync
Message:

bugref:9416. The part of OCI import logic. New functions - OciRestClient::exportImage, createImageFromInstance; new API functions - ICloudClient::importInstance, getInstanceInfo; new helper classes - HandleRestBinaryResponse, DownloadSession; changes in the Appliance import and export parts.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageAppliance.cpp

    r76553 r78428  
    146146    { "--disk",                 'D', RTGETOPT_REQ_STRING },
    147147    { "--options",              'O', RTGETOPT_REQ_STRING },
     148
     149    { "--cloud",                'j', RTGETOPT_REQ_NOTHING},
     150    { "--cloudprofile",         'k', RTGETOPT_REQ_STRING },
     151    { "--cloudinstanceid",      'l', RTGETOPT_REQ_STRING }
    148152};
     153
     154enum
     155{
     156    NOT_SET, LOCAL, CLOUD
     157} actionType;
    149158
    150159RTEXITCODE handleImportAppliance(HandlerArg *arg)
    151160{
    152161    HRESULT rc = S_OK;
    153 
     162    bool fCloud = false; // the default
     163    actionType = NOT_SET;
    154164    Utf8Str strOvfFilename;
    155165    bool fExecute = true;                  // if true, then we actually do the import
     
    182192
    183193            case 's':   // --vsys
     194                if (fCloud == false && actionType == NOT_SET)
     195                    actionType = LOCAL;
     196
     197                if (actionType != LOCAL)
     198                    return errorSyntax(USAGE_EXPORTAPPLIANCE,
     199                                       "Option \"%s\" can't be used together with \"--cloud\" argument.",
     200                                       GetState.pDef->pszLong);
     201
    184202                ulCurVsys = ValueUnion.u32;
    185203                ulCurUnit = (uint32_t)-1;
     
    187205
    188206            case 'o':   // --ostype
    189                 if (ulCurVsys == (uint32_t)-1)
    190                     return errorSyntax(USAGE_IMPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
     207                if (actionType == LOCAL && ulCurVsys == (uint32_t)-1)
     208                    return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    191209                mapArgsMapsPerVsys[ulCurVsys]["ostype"] = ValueUnion.psz;
    192210                break;
    193211
    194212            case 'V':   // --vmname
    195                 if (ulCurVsys == (uint32_t)-1)
     213                if (actionType == LOCAL && ulCurVsys == (uint32_t)-1)
    196214                    return errorSyntax(USAGE_IMPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    197215                mapArgsMapsPerVsys[ulCurVsys]["vmname"] = ValueUnion.psz;
     
    199217
    200218            case 'S':   // --settingsfile
    201                 if (ulCurVsys == (uint32_t)-1)
     219                if (actionType == LOCAL && ulCurVsys == (uint32_t)-1)
    202220                    return errorSyntax(USAGE_IMPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    203221                mapArgsMapsPerVsys[ulCurVsys]["settingsfile"] = ValueUnion.psz;
     
    205223
    206224            case 'p':   // --basefolder
    207                 if (ulCurVsys == (uint32_t)-1)
     225                if (actionType == LOCAL && ulCurVsys == (uint32_t)-1)
    208226                    return errorSyntax(USAGE_IMPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    209227                mapArgsMapsPerVsys[ulCurVsys]["basefolder"] = ValueUnion.psz;
     
    211229
    212230            case 'g':   // --group
    213                 if (ulCurVsys == (uint32_t)-1)
     231                if (actionType == LOCAL && ulCurVsys == (uint32_t)-1)
    214232                    return errorSyntax(USAGE_IMPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    215233                mapArgsMapsPerVsys[ulCurVsys]["group"] = ValueUnion.psz;
     
    217235
    218236            case 'd':   // --description
    219                 if (ulCurVsys == (uint32_t)-1)
     237                if (actionType == LOCAL && ulCurVsys == (uint32_t)-1)
    220238                    return errorSyntax(USAGE_IMPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    221239                mapArgsMapsPerVsys[ulCurVsys]["description"] = ValueUnion.psz;
     
    223241
    224242            case 'L':   // --eula
    225                 if (ulCurVsys == (uint32_t)-1)
     243                if (actionType == LOCAL && ulCurVsys == (uint32_t)-1)
    226244                    return errorSyntax(USAGE_IMPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    227245                mapArgsMapsPerVsys[ulCurVsys]["eula"] = ValueUnion.psz;
     
    229247
    230248            case 'm':   // --memory
    231                 if (ulCurVsys == (uint32_t)-1)
     249                if (actionType == LOCAL && ulCurVsys == (uint32_t)-1)
    232250                    return errorSyntax(USAGE_IMPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    233251                mapArgsMapsPerVsys[ulCurVsys]["memory"] = ValueUnion.psz;
     
    235253
    236254            case 'c':   // --cpus
    237                 if (ulCurVsys == (uint32_t)-1)
     255                if (actionType == LOCAL && ulCurVsys == (uint32_t)-1)
    238256                    return errorSyntax(USAGE_IMPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    239257                mapArgsMapsPerVsys[ulCurVsys]["cpus"] = ValueUnion.psz;
     
    245263
    246264            case 'x':   // --ignore
    247                 if (ulCurVsys == (uint32_t)-1)
     265                if (actionType == LOCAL && ulCurVsys == (uint32_t)-1)
    248266                    return errorSyntax(USAGE_IMPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    249267                if (ulCurUnit == (uint32_t)-1)
     
    253271
    254272            case 'T':   // --scsitype
    255                 if (ulCurVsys == (uint32_t)-1)
     273                if (actionType == LOCAL && ulCurVsys == (uint32_t)-1)
    256274                    return errorSyntax(USAGE_IMPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    257275                if (ulCurUnit == (uint32_t)-1)
     
    261279
    262280            case 'C':   // --controller
    263                 if (ulCurVsys == (uint32_t)-1)
     281                if (actionType == LOCAL && ulCurVsys == (uint32_t)-1)
    264282                    return errorSyntax(USAGE_IMPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    265283                if (ulCurUnit == (uint32_t)-1)
     
    269287
    270288            case 'D':   // --disk
    271                 if (ulCurVsys == (uint32_t)-1)
     289                if (actionType == LOCAL && ulCurVsys == (uint32_t)-1)
    272290                    return errorSyntax(USAGE_IMPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    273291                if (ulCurUnit == (uint32_t)-1)
     
    279297                if (RT_FAILURE(parseImportOptions(ValueUnion.psz, &options)))
    280298                    return errorArgument("Invalid import options '%s'\n", ValueUnion.psz);
     299                break;
     300
     301                /*--cloud and --vsys are orthogonal, only one must be presented*/
     302            case 'j':   // --cloud
     303                if (fCloud == false && actionType == NOT_SET)
     304                {
     305                    fCloud = true;
     306                    actionType = CLOUD;
     307                }
     308
     309                if (actionType != CLOUD)
     310                    return errorSyntax(USAGE_IMPORTAPPLIANCE,
     311                                       "Option \"%s\" can't be used together with \"--vsys\" argument.",
     312                                       GetState.pDef->pszLong);
     313
     314                ulCurVsys = 0;
     315                break;
     316
     317                /* Cloud export settings */
     318            case 'k':   // --cloudprofile
     319                if (actionType != CLOUD)
     320                    return errorSyntax(USAGE_IMPORTAPPLIANCE, "Option \"%s\" requires preceding --cloud argument.",
     321                                       GetState.pDef->pszLong);
     322                mapArgsMapsPerVsys[ulCurVsys]["cloudprofile"] = ValueUnion.psz;
     323                break;
     324
     325            case 'l':   // --cloudinstanceid
     326                if (actionType != CLOUD)
     327                    return errorSyntax(USAGE_IMPORTAPPLIANCE, "Option \"%s\" requires preceding --cloud argument.",
     328                                       GetState.pDef->pszLong);
     329                mapArgsMapsPerVsys[ulCurVsys]["cloudinstanceid"] = ValueUnion.psz;
    281330                break;
    282331
     
    305354    }
    306355
    307     if (strOvfFilename.isEmpty())
     356    if (actionType == LOCAL && strOvfFilename.isEmpty())
    308357        return errorSyntax(USAGE_IMPORTAPPLIANCE, "Not enough arguments for \"import\" command.");
    309358
     
    313362        CHECK_ERROR_BREAK(arg->virtualBox, CreateAppliance(pAppliance.asOutParam()));
    314363
     364        //in the case of Cloud, append the instance id here because later it's harder to do
     365        if (actionType == CLOUD &&
     366            mapArgsMapsPerVsys[ulCurVsys]["cloudprofile"].isNotEmpty() &&
     367            mapArgsMapsPerVsys[ulCurVsys]["cloudinstanceid"].isNotEmpty())
     368        {
     369            strOvfFilename.append(mapArgsMapsPerVsys[ulCurVsys]["cloudprofile"]);
     370            strOvfFilename.append("/");
     371            strOvfFilename.append(mapArgsMapsPerVsys[ulCurVsys]["cloudinstanceid"]);
     372        }
     373        else
     374            return errorSyntax(USAGE_IMPORTAPPLIANCE, "Not enough arguments for import from the Cloud.");
     375
    315376        char *pszAbsFilePath;
    316377        if (strOvfFilename.startsWith("S3://", RTCString::CaseInsensitive) ||
    317378            strOvfFilename.startsWith("SunCloud://", RTCString::CaseInsensitive) ||
    318             strOvfFilename.startsWith("webdav://", RTCString::CaseInsensitive))
     379            strOvfFilename.startsWith("webdav://", RTCString::CaseInsensitive) ||
     380            strOvfFilename.startsWith("OCI://", RTCString::CaseInsensitive))
    319381            pszAbsFilePath = RTStrDup(strOvfFilename.c_str());
    320382        else
    321383            pszAbsFilePath = RTPathAbsDup(strOvfFilename.c_str());
     384
    322385        ComPtr<IProgress> progressRead;
    323386        CHECK_ERROR_BREAK(pAppliance, Read(Bstr(pszAbsFilePath).raw(),
     
    330393        Bstr path; /* fetch the path, there is stuff like username/password removed if any */
    331394        CHECK_ERROR_BREAK(pAppliance, COMGETTER(Path)(path.asOutParam()));
    332         // call interpret(); this can yield both warnings and errors, so we need
    333         // to tinker with the error info a bit
    334         RTStrmPrintf(g_pStdErr, "Interpreting %ls...\n", path.raw());
    335         rc = pAppliance->Interpret();
    336         com::ErrorInfo info0(pAppliance, COM_IIDOF(IAppliance));
    337 
    338         com::SafeArray<BSTR> aWarnings;
    339         if (SUCCEEDED(pAppliance->GetWarnings(ComSafeArrayAsOutParam(aWarnings))))
    340         {
    341             size_t cWarnings = aWarnings.size();
    342             for (unsigned i = 0; i < cWarnings; ++i)
    343             {
    344                 Bstr bstrWarning(aWarnings[i]);
    345                 RTMsgWarning("%ls.", bstrWarning.raw());
    346             }
    347         }
    348 
    349         if (FAILED(rc))     // during interpret, after printing warnings
    350         {
    351             com::GluePrintErrorInfo(info0);
    352             com::GluePrintErrorContext("Interpret", __FILE__, __LINE__);
    353             break;
    354         }
    355 
    356         RTStrmPrintf(g_pStdErr, "OK.\n");
    357 
    358         // fetch all disks
    359         com::SafeArray<BSTR> retDisks;
    360         CHECK_ERROR_BREAK(pAppliance,
    361                           COMGETTER(Disks)(ComSafeArrayAsOutParam(retDisks)));
    362         if (retDisks.size() > 0)
    363         {
    364             RTPrintf("Disks:\n");
    365             for (unsigned i = 0; i < retDisks.size(); i++)
    366                 RTPrintf("  %ls\n", retDisks[i]);
    367             RTPrintf("\n");
    368         }
    369395
    370396        // fetch virtual system descriptions
     
    375401        size_t cVirtualSystemDescriptions = aVirtualSystemDescriptions.size();
    376402
    377         // match command line arguments with virtual system descriptions;
    378         // this is only to sort out invalid indices at this time
    379         ArgsMapsMap::const_iterator it;
    380         for (it = mapArgsMapsPerVsys.begin();
    381              it != mapArgsMapsPerVsys.end();
    382              ++it)
     403        if (actionType == LOCAL)
    383404        {
    384             uint32_t ulVsys = it->first;
    385             if (ulVsys >= cVirtualSystemDescriptions)
    386                 return errorSyntax(USAGE_IMPORTAPPLIANCE,
    387                                    "Invalid index %RI32 with -vsys option; the OVF contains only %zu virtual system(s).",
    388                                    ulVsys, cVirtualSystemDescriptions);
     405            // call interpret(); this can yield both warnings and errors, so we need
     406            // to tinker with the error info a bit
     407            RTStrmPrintf(g_pStdErr, "Interpreting %ls...\n", path.raw());
     408            rc = pAppliance->Interpret();
     409            com::ErrorInfo info0(pAppliance, COM_IIDOF(IAppliance));
     410
     411            com::SafeArray<BSTR> aWarnings;
     412            if (SUCCEEDED(pAppliance->GetWarnings(ComSafeArrayAsOutParam(aWarnings))))
     413            {
     414                size_t cWarnings = aWarnings.size();
     415                for (unsigned i = 0; i < cWarnings; ++i)
     416                {
     417                    Bstr bstrWarning(aWarnings[i]);
     418                    RTMsgWarning("%ls.", bstrWarning.raw());
     419                }
     420            }
     421
     422            if (FAILED(rc))     // during interpret, after printing warnings
     423            {
     424                com::GluePrintErrorInfo(info0);
     425                com::GluePrintErrorContext("Interpret", __FILE__, __LINE__);
     426                break;
     427            }
     428
     429            RTStrmPrintf(g_pStdErr, "OK.\n");
     430
     431            // fetch all disks
     432            com::SafeArray<BSTR> retDisks;
     433            CHECK_ERROR_BREAK(pAppliance,
     434                              COMGETTER(Disks)(ComSafeArrayAsOutParam(retDisks)));
     435            if (retDisks.size() > 0)
     436            {
     437                RTPrintf("Disks:\n");
     438                for (unsigned i = 0; i < retDisks.size(); i++)
     439                    RTPrintf("  %ls\n", retDisks[i]);
     440                RTPrintf("\n");
     441            }
     442
     443            // match command line arguments with virtual system descriptions;
     444            // this is only to sort out invalid indices at this time
     445            ArgsMapsMap::const_iterator it;
     446            for (it = mapArgsMapsPerVsys.begin();
     447                 it != mapArgsMapsPerVsys.end();
     448                 ++it)
     449            {
     450                uint32_t ulVsys = it->first;
     451                if (ulVsys >= cVirtualSystemDescriptions)
     452                    return errorSyntax(USAGE_IMPORTAPPLIANCE,
     453                                       "Invalid index %RI32 with -vsys option; the OVF contains only %zu virtual system(s).",
     454                                       ulVsys, cVirtualSystemDescriptions);
     455            }
    389456        }
    390457
     
    920987                        case VirtualSystemDescriptionType_CloudKeepObject:
    921988                        case VirtualSystemDescriptionType_CloudLaunchInstance:
     989                        case VirtualSystemDescriptionType_CloudInstanceId:
     990                        case VirtualSystemDescriptionType_CloudImageId:
    922991                        case VirtualSystemDescriptionType_Miscellaneous:
    923992                            /** @todo  VirtualSystemDescriptionType_Miscellaneous? */
     
    10411110};
    10421111
    1043 enum
    1044 {
    1045     NOT_SET, LOCAL, CLOUD
    1046 } exportType;
    1047 
    10481112RTEXITCODE handleExportAppliance(HandlerArg *a)
    10491113{
     
    10541118    bool fManifest = false; // the default
    10551119    bool fCloud = false; // the default
    1056     exportType = NOT_SET;
     1120    actionType = NOT_SET;
    10571121    bool fExportISOImages = false; // the default
    10581122    com::SafeArray<ExportOptions_T> options;
     
    11091173
    11101174                case 's':   // --vsys
    1111                     if (fCloud == false && exportType == NOT_SET)
    1112                         exportType = LOCAL;
    1113 
    1114                     if (exportType != LOCAL)
     1175                    if (fCloud == false && actionType == NOT_SET)
     1176                        actionType = LOCAL;
     1177
     1178                    if (actionType != LOCAL)
    11151179                        return errorSyntax(USAGE_EXPORTAPPLIANCE,
    11161180                                           "Option \"%s\" can't be used together with \"--cloud\" argument.",
     
    11211185
    11221186                case 'V':   // --vmname
    1123                     if (exportType == NOT_SET || ulCurVsys == (uint32_t)-1)
     1187                    if (actionType == NOT_SET || ulCurVsys == (uint32_t)-1)
    11241188                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys or --cloud argument.",
    11251189                                           GetState.pDef->pszLong);
     
    11281192
    11291193                case 'p':   // --product
    1130                     if (exportType != LOCAL)
     1194                    if (actionType != LOCAL)
    11311195                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    11321196                    mapArgsMapsPerVsys[ulCurVsys]["product"] = ValueUnion.psz;
     
    11341198
    11351199                case 'P':   // --producturl
    1136                     if (exportType != LOCAL)
     1200                    if (actionType != LOCAL)
    11371201                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    11381202                    mapArgsMapsPerVsys[ulCurVsys]["producturl"] = ValueUnion.psz;
     
    11401204
    11411205                case 'n':   // --vendor
    1142                     if (exportType != LOCAL)
     1206                    if (actionType != LOCAL)
    11431207                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    11441208                    mapArgsMapsPerVsys[ulCurVsys]["vendor"] = ValueUnion.psz;
     
    11461210
    11471211                case 'N':   // --vendorurl
    1148                     if (exportType != LOCAL)
     1212                    if (actionType != LOCAL)
    11491213                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    11501214                    mapArgsMapsPerVsys[ulCurVsys]["vendorurl"] = ValueUnion.psz;
     
    11521216
    11531217                case 'v':   // --version
    1154                     if (exportType != LOCAL)
     1218                    if (actionType != LOCAL)
    11551219                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    11561220                    mapArgsMapsPerVsys[ulCurVsys]["version"] = ValueUnion.psz;
     
    11581222
    11591223                case 'd':   // --description
    1160                     if (exportType != LOCAL)
     1224                    if (actionType != LOCAL)
    11611225                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    11621226                    mapArgsMapsPerVsys[ulCurVsys]["description"] = ValueUnion.psz;
     
    11641228
    11651229                case 'e':   // --eula
    1166                     if (exportType != LOCAL)
     1230                    if (actionType != LOCAL)
    11671231                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    11681232                    mapArgsMapsPerVsys[ulCurVsys]["eula"] = ValueUnion.psz;
     
    11701234
    11711235                case 'E':   // --eulafile
    1172                     if (exportType != LOCAL)
     1236                    if (actionType != LOCAL)
    11731237                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --vsys argument.", GetState.pDef->pszLong);
    11741238                    mapArgsMapsPerVsys[ulCurVsys]["eulafile"] = ValueUnion.psz;
     
    11821246                    /*--cloud and --vsys are orthogonal, only one must be presented*/
    11831247                case 'C':   // --cloud
    1184                     if (fCloud == false && exportType == NOT_SET)
     1248                    if (fCloud == false && actionType == NOT_SET)
    11851249                    {
    11861250                        fCloud = true;
    1187                         exportType = CLOUD;
     1251                        actionType = CLOUD;
    11881252                    }
    11891253
    1190                     if (exportType != CLOUD)
     1254                    if (actionType != CLOUD)
    11911255                        return errorSyntax(USAGE_EXPORTAPPLIANCE,
    11921256                                           "Option \"%s\" can't be used together with \"--vsys\" argument.",
     
    11981262                    /* Cloud export settings */
    11991263                case 'S':   // --cloudshape
    1200                     if (exportType != CLOUD)
     1264                    if (actionType != CLOUD)
    12011265                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --cloud argument.",
    12021266                                           GetState.pDef->pszLong);
     
    12051269
    12061270                case 'D':   // --clouddomain
    1207                     if (exportType != CLOUD)
     1271                    if (actionType != CLOUD)
    12081272                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --cloud argument.",
    12091273                                           GetState.pDef->pszLong);
     
    12121276
    12131277                case 'R':   // --clouddisksize
    1214                     if (exportType != CLOUD)
     1278                    if (actionType != CLOUD)
    12151279                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --cloud argument.",
    12161280                                           GetState.pDef->pszLong);
     
    12191283
    12201284                case 'B':   // --cloudbucket
    1221                     if (exportType != CLOUD)
     1285                    if (actionType != CLOUD)
    12221286                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --cloud argument.",
    12231287                                           GetState.pDef->pszLong);
     
    12261290
    12271291                case 'Q':   // --cloudocivcn
    1228                     if (exportType != CLOUD)
     1292                    if (actionType != CLOUD)
    12291293                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --cloud argument.",
    12301294                                           GetState.pDef->pszLong);
     
    12331297
    12341298                case 'A':   // --cloudpublicip
    1235                     if (exportType != CLOUD)
     1299                    if (actionType != CLOUD)
    12361300                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --cloud argument.",
    12371301                                           GetState.pDef->pszLong);
     
    12401304
    12411305                case 'F':   // --cloudprofile
    1242                     if (exportType != CLOUD)
     1306                    if (actionType != CLOUD)
    12431307                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --cloud argument.",
    12441308                                           GetState.pDef->pszLong);
     
    12471311
    12481312                case 'T':   // --cloudocisubnet
    1249                     if (exportType != CLOUD)
     1313                    if (actionType != CLOUD)
    12501314                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --cloud argument.",
    12511315                                           GetState.pDef->pszLong);
     
    12541318
    12551319                case 'K':   // --cloudkeepobject
    1256                     if (exportType != CLOUD)
     1320                    if (actionType != CLOUD)
    12571321                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --cloud argument.",
    12581322                                           GetState.pDef->pszLong);
     
    12611325
    12621326                case 'L':   // --cloudlaunchinstance
    1263                     if (exportType != CLOUD)
     1327                    if (actionType != CLOUD)
    12641328                        return errorSyntax(USAGE_EXPORTAPPLIANCE, "Option \"%s\" requires preceding --cloud argument.",
    12651329                                           GetState.pDef->pszLong);
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette