On 11/10/2014 05:55 PM, Aaron Karper wrote:
> On Thu, Nov 06, 2014 at 12:30:42AM +0200, Alex Pyrgiotis wrote:
>> Modify Haskell code to accept the attach/detach action and the "UUID"
>> disk parameter. Also, modify the _ConvertNicDiskModifications function
>> to accept the new DDM_ATTACH/DDM_DETACH values. Finally, do minor
>> changes in Python code and tests in order to make the tests pass.
>>
>> Signed-off-by: Alex Pyrgiotis <[email protected] <mailto:[email protected]>>
>>
>> diff --git a/lib/client/gnt_instance.py b/lib/client/gnt_instance.py
>> index b93ffa0..1a589ea 100644
>> --- a/lib/client/gnt_instance.py
>> +++ b/lib/client/gnt_instance.py
>> @@ -1256,37 +1256,59 @@ def _ConvertNicDiskModifications(__mods):
>>        # Add item as last item (legacy interface)
>>        action = constants.DDM_ADD
>>        identifier = -1
>> +    elif identifier == constants.DDM_ATTACH:
>> +      # Attach item as last item (legacy interface)
>> +      action = constants.DDM_ATTACH
>> +      identifier = -1
>>      elif identifier == constants.DDM_REMOVE:
>>        # Remove last item (legacy interface)
>>        action = constants.DDM_REMOVE
>>        identifier = -1
>> +    elif identifier == constants.DDM_DETACH:
>> +      # Detach last item (legacy interface)
>> +      action = constants.DDM_DETACH
>> +      identifier = -1
>>      else:
>> -      # Modifications and adding/removing at arbitrary indices
>> +      # Modifications and adding/attaching/removing/__detaching at
> arbitrary
>> +      # indices
>>        add = params.pop(constants.DDM_ADD, _MISSING)
>> +      attach = params.pop(constants.DDM___ATTACH, _MISSING)
>>        remove = params.pop(constants.DDM___REMOVE, _MISSING)
>> +      detach = params.pop(constants.DDM___DETACH, _MISSING)
>>        modify = params.pop(constants.DDM___MODIFY, _MISSING)
>>
>>        if modify is _MISSING:
> 
> Since modify/add/attach/remove/__detach are all mutually exclusive, there
> is no need to handle it differently from the rest.
> 

ACK

>>
>> -        if not (add is _MISSING or remove is _MISSING):
>> -          raise errors.OpPrereqError("Cannot add and remove at the
> same time",
>> -                                     errors.ECODE_INVAL)
>> -        elif add is not _MISSING:
>> -          action = constants.DDM_ADD
>> -        elif remove is not _MISSING:
>> -          action = constants.DDM_REMOVE
>> -        else:
>> -          action = constants.DDM_MODIFY
>> -
>> -      elif add is _MISSING and remove is _MISSING:
>> +        # Check if the user has requested more than one operation and
> raise an
>> +        # exception. If no operations have been given, default to modify.
>> +        action = constants.DDM_MODIFY
>> +        ops = {
>> +          constants.DDM_ADD: add,
>> +          constants.DDM_ATTACH: attach,
>> +          constants.DDM_REMOVE: remove,
>> +          constants.DDM_DETACH: detach
>> +        }
>> +        count = 0
>> +        for op, param in ops.items():
>> +          if param is not _MISSING:
>> +            count += 1
>> +            action = op
>> +        if count > 1:
>> +          raise errors.OpPrereqError(
>> +            "Cannot do more than one of the following operations at the"
>> +            " same time: %s" % ", ".join(ops.keys()),
>> +            errors.ECODE_INVAL)
>> +
>> +      elif (add is _MISSING and attach is _MISSING and remove is
> _MISSING and
>> +            detach is _MISSING):
>>          action = constants.DDM_MODIFY
>>        else:
>> -        raise errors.OpPrereqError("Cannot modify and add/remove at the"
>> -                                   " same time", errors.ECODE_INVAL)
>> +        raise errors.OpPrereqError("Cannot modify and
> add/attach/remove/detach"
>> +                                   " at the same time",
> errors.ECODE_INVAL)
>>
>>        assert not (constants.DDMS_VALUES_WITH___MODIFY &
> set(params.keys()))
>>
>> -    if action == constants.DDM_REMOVE and params:
>> -      raise errors.OpPrereqError("Not accepting parameters on removal",
>> +    if action in (constants.DDM_REMOVE, constants.DDM_DETACH) and params:
>> +      raise errors.OpPrereqError("Not accepting parameters on
> removal/detach",
>>                                   errors.ECODE_INVAL)
>>
>>      result.append((action, identifier, params))
>> diff --git a/src/Ganeti/Constants.hs b/src/Ganeti/Constants.hs
>> index ada0549..bbe0f1b 100644
>> --- a/src/Ganeti/Constants.hs
>> +++ b/src/Ganeti/Constants.hs
>> @@ -1195,14 +1195,20 @@ inisectOspPrivate = "os_private"
>>  ddmAdd :: String
>>  ddmAdd = Types.ddmFullToRaw DdmFullAdd
>>
>> +ddmAttach :: String
>> +ddmAttach = Types.ddmFullToRaw DdmFullAttach
>> +
>>  ddmModify :: String
>>  ddmModify = Types.ddmFullToRaw DdmFullModify
>>
>>  ddmRemove :: String
>>  ddmRemove = Types.ddmFullToRaw DdmFullRemove
>>
>> +ddmDetach :: String
>> +ddmDetach = Types.ddmFullToRaw DdmFullDetach
>> +
>>  ddmsValues :: FrozenSet String
>> -ddmsValues = ConstantUtils.mkSet [ddmAdd, ddmRemove]
>> +ddmsValues = ConstantUtils.mkSet [ddmAdd, ddmAttach, ddmRemove,
> ddmDetach]
>>
>>  ddmsValuesWithModify :: FrozenSet String
>>  ddmsValuesWithModify = ConstantUtils.mkSet $ map Types.ddmFullToRaw
> [minBound..]
>> diff --git a/src/Ganeti/Types.hs b/src/Ganeti/Types.hs
>> index bc804fb..57de8fb 100644
>> --- a/src/Ganeti/Types.hs
>> +++ b/src/Ganeti/Types.hs
>> @@ -430,7 +430,9 @@ $(THH.makeJSONInstance ''CVErrorCode)
>>  -- | Dynamic device modification, just add/remove version.
>>  $(THH.declareLADT ''String "DdmSimple"
>>       [ ("DdmSimpleAdd",    "add")
>> +     , ("DdmSimpleAttach", "attach")
>>       , ("DdmSimpleRemove", "remove")
>> +     , ("DdmSimpleDetach", "detach")
>>       ])
>>  $(THH.makeJSONInstance ''DdmSimple)
>>
>> @@ -439,7 +441,9 @@ $(THH.makeJSONInstance ''DdmSimple)
>>  -- TODO: DDM_SWAP, DDM_MOVE?
>>  $(THH.declareLADT ''String "DdmFull"
>>       [ ("DdmFullAdd",    "add")
>> +     , ("DdmFullAttach", "attach")
>>       , ("DdmFullRemove", "remove")
>> +     , ("DdmFullDetach", "detach")
>>       , ("DdmFullModify", "modify")
>>       ])
>>  $(THH.makeJSONInstance ''DdmFull)
>> --
>> 1.7.10.4
>>
> 
> --
> Google Germany GmbH
> Dienerstr. 12
> 80331 München
> 
> Registergericht und -nummer: Hamburg, HRB 86891
> Sitz der Gesellschaft: Hamburg
> Geschäftsführer: Graham Law, Christine Elizabeth Flores


-- 
Alex | [email protected]

Reply via email to