Statistics
| Branch: | Tag: | Revision:

root / src / Ganeti / OpCodes.hs @ d2204b1a

History | View | Annotate | Download (16.6 kB)

1
{-# LANGUAGE TemplateHaskell #-}
2

    
3
{-| Implementation of the opcodes.
4

    
5
-}
6

    
7
{-
8

    
9
Copyright (C) 2009, 2010, 2011, 2012, 2013 Google Inc.
10

    
11
This program is free software; you can redistribute it and/or modify
12
it under the terms of the GNU General Public License as published by
13
the Free Software Foundation; either version 2 of the License, or
14
(at your option) any later version.
15

    
16
This program is distributed in the hope that it will be useful, but
17
WITHOUT ANY WARRANTY; without even the implied warranty of
18
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19
General Public License for more details.
20

    
21
You should have received a copy of the GNU General Public License
22
along with this program; if not, write to the Free Software
23
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
24
02110-1301, USA.
25

    
26
-}
27

    
28
module Ganeti.OpCodes
29
  ( OpCode(..)
30
  , TagObject(..)
31
  , tagObjectFrom
32
  , encodeTagObject
33
  , decodeTagObject
34
  , ReplaceDisksMode(..)
35
  , DiskIndex
36
  , mkDiskIndex
37
  , unDiskIndex
38
  , opID
39
  , allOpIDs
40
  , allOpFields
41
  , opSummary
42
  , CommonOpParams(..)
43
  , defOpParams
44
  , MetaOpCode(..)
45
  , wrapOpCode
46
  , setOpComment
47
  , setOpPriority
48
  ) where
49

    
50
import Data.Maybe (fromMaybe)
51
import Text.JSON (readJSON, showJSON, JSON, JSValue, makeObj)
52
import qualified Text.JSON
53

    
54
import Ganeti.THH
55

    
56
import Ganeti.OpParams
57
import Ganeti.Types (OpSubmitPriority(..), fromNonEmpty)
58
import Ganeti.Query.Language (queryTypeOpToRaw)
59

    
60
-- | OpCode representation.
61
--
62
-- We only implement a subset of Ganeti opcodes: those which are actually used
63
-- in the htools codebase.
64
$(genOpCode "OpCode"
65
  [ ("OpTestDelay",
66
     [ pDelayDuration
67
     , pDelayOnMaster
68
     , pDelayOnNodes
69
     , pDelayRepeat
70
     ])
71
  , ("OpInstanceReplaceDisks",
72
     [ pInstanceName
73
     , pEarlyRelease
74
     , pIgnoreIpolicy
75
     , pReplaceDisksMode
76
     , pReplaceDisksList
77
     , pRemoteNode
78
     , pIallocator
79
     ])
80
  , ("OpInstanceFailover",
81
     [ pInstanceName
82
     , pShutdownTimeout
83
     , pIgnoreConsistency
84
     , pMigrationTargetNode
85
     , pIgnoreIpolicy
86
     , pIallocator
87
     ])
88
  , ("OpInstanceMigrate",
89
     [ pInstanceName
90
     , pMigrationMode
91
     , pMigrationLive
92
     , pMigrationTargetNode
93
     , pAllowRuntimeChgs
94
     , pIgnoreIpolicy
95
     , pMigrationCleanup
96
     , pIallocator
97
     , pAllowFailover
98
     ])
99
  , ("OpTagsGet",
100
     [ pTagsObject
101
     , pUseLocking
102
     ])
103
  , ("OpTagsSearch",
104
     [ pTagSearchPattern ])
105
  , ("OpTagsSet",
106
     [ pTagsObject
107
     , pTagsList
108
     ])
109
  , ("OpTagsDel",
110
     [ pTagsObject
111
     , pTagsList
112
     ])
113
  , ("OpClusterPostInit", [])
114
  , ("OpClusterDestroy", [])
115
  , ("OpClusterQuery", [])
116
  , ("OpClusterVerify",
117
     [ pDebugSimulateErrors
118
     , pErrorCodes
119
     , pSkipChecks
120
     , pIgnoreErrors
121
     , pVerbose
122
     , pOptGroupName
123
     ])
124
  , ("OpClusterVerifyConfig",
125
     [ pDebugSimulateErrors
126
     , pErrorCodes
127
     , pIgnoreErrors
128
     , pVerbose
129
     ])
130
  , ("OpClusterVerifyGroup",
131
     [ pGroupName
132
     , pDebugSimulateErrors
133
     , pErrorCodes
134
     , pSkipChecks
135
     , pIgnoreErrors
136
     , pVerbose
137
     ])
138
  , ("OpClusterVerifyDisks", [])
139
  , ("OpGroupVerifyDisks",
140
     [ pGroupName
141
     ])
142
  , ("OpClusterRepairDiskSizes",
143
     [ pInstances
144
     ])
145
  , ("OpClusterConfigQuery",
146
     [ pOutputFields
147
     ])
148
  , ("OpClusterRename",
149
     [ pName
150
     ])
151
  , ("OpClusterSetParams",
152
     [ pHvState
153
     , pDiskState
154
     , pVgName
155
     , pEnabledHypervisors
156
     , pClusterHvParams
157
     , pClusterBeParams
158
     , pOsHvp
159
     , pClusterOsParams
160
     , pDiskParams
161
     , pCandidatePoolSize
162
     , pUidPool
163
     , pAddUids
164
     , pRemoveUids
165
     , pMaintainNodeHealth
166
     , pPreallocWipeDisks
167
     , pNicParams
168
     , pNdParams
169
     , pIpolicy
170
     , pDrbdHelper
171
     , pDefaultIAllocator
172
     , pMasterNetdev
173
     , pMasterNetmask
174
     , pReservedLvs
175
     , pHiddenOs
176
     , pBlacklistedOs
177
     , pUseExternalMipScript
178
     , pEnabledStorageTypes
179
     ])
180
  , ("OpClusterRedistConf", [])
181
  , ("OpClusterActivateMasterIp", [])
182
  , ("OpClusterDeactivateMasterIp", [])
183
  , ("OpQuery",
184
     [ pQueryWhat
185
     , pUseLocking
186
     , pQueryFields
187
     , pQueryFilter
188
     ])
189
  , ("OpQueryFields",
190
     [ pQueryWhat
191
     , pQueryFields
192
     ])
193
  , ("OpOobCommand",
194
     [ pNodeNames
195
     , pOobCommand
196
     , pOobTimeout
197
     , pIgnoreStatus
198
     , pPowerDelay
199
     ])
200
  , ("OpNodeRemove", [ pNodeName ])
201
  , ("OpNodeAdd",
202
     [ pNodeName
203
     , pHvState
204
     , pDiskState
205
     , pPrimaryIp
206
     , pSecondaryIp
207
     , pReadd
208
     , pNodeGroup
209
     , pMasterCapable
210
     , pVmCapable
211
     , pNdParams
212
    ])
213
  , ("OpNodeQuery", dOldQuery)
214
  , ("OpNodeQueryvols",
215
     [ pOutputFields
216
     , pNodes
217
     ])
218
  , ("OpNodeQueryStorage",
219
     [ pOutputFields
220
     , pStorageType
221
     , pNodes
222
     , pStorageName
223
     ])
224
  , ("OpNodeModifyStorage",
225
     [ pNodeName
226
     , pStorageType
227
     , pStorageName
228
     , pStorageChanges
229
     ])
230
  , ("OpRepairNodeStorage",
231
     [ pNodeName
232
     , pStorageType
233
     , pStorageName
234
     , pIgnoreConsistency
235
     ])
236
  , ("OpNodeSetParams",
237
     [ pNodeName
238
     , pForce
239
     , pHvState
240
     , pDiskState
241
     , pMasterCandidate
242
     , pOffline
243
     , pDrained
244
     , pAutoPromote
245
     , pMasterCapable
246
     , pVmCapable
247
     , pSecondaryIp
248
     , pNdParams
249
     , pPowered
250
     ])
251
  , ("OpNodePowercycle",
252
     [ pNodeName
253
     , pForce
254
     ])
255
  , ("OpNodeMigrate",
256
     [ pNodeName
257
     , pMigrationMode
258
     , pMigrationLive
259
     , pMigrationTargetNode
260
     , pAllowRuntimeChgs
261
     , pIgnoreIpolicy
262
     , pIallocator
263
     ])
264
  , ("OpNodeEvacuate",
265
     [ pEarlyRelease
266
     , pNodeName
267
     , pRemoteNode
268
     , pIallocator
269
     , pEvacMode
270
     ])
271
  , ("OpInstanceCreate",
272
     [ pInstanceName
273
     , pForceVariant
274
     , pWaitForSync
275
     , pNameCheck
276
     , pIgnoreIpolicy
277
     , pInstBeParams
278
     , pInstDisks
279
     , pDiskTemplate
280
     , pFileDriver
281
     , pFileStorageDir
282
     , pInstHvParams
283
     , pHypervisor
284
     , pIallocator
285
     , pResetDefaults
286
     , pIpCheck
287
     , pIpConflictsCheck
288
     , pInstCreateMode
289
     , pInstNics
290
     , pNoInstall
291
     , pInstOsParams
292
     , pInstOs
293
     , pPrimaryNode
294
     , pSecondaryNode
295
     , pSourceHandshake
296
     , pSourceInstance
297
     , pSourceShutdownTimeout
298
     , pSourceX509Ca
299
     , pSrcNode
300
     , pSrcPath
301
     , pStartInstance
302
     , pOpportunisticLocking
303
     , pInstTags
304
     ])
305
  , ("OpInstanceMultiAlloc",
306
     [ pIallocator
307
     , pMultiAllocInstances
308
     , pOpportunisticLocking
309
     ])
310
  , ("OpInstanceReinstall",
311
     [ pInstanceName
312
     , pForceVariant
313
     , pInstOs
314
     , pTempOsParams
315
     ])
316
  , ("OpInstanceRemove",
317
     [ pInstanceName
318
     , pShutdownTimeout
319
     , pIgnoreFailures
320
     ])
321
  , ("OpInstanceRename",
322
     [ pInstanceName
323
     , pNewName
324
     , pNameCheck
325
     , pIpCheck
326
     ])
327
  , ("OpInstanceStartup",
328
     [ pInstanceName
329
     , pForce
330
     , pIgnoreOfflineNodes
331
     , pTempHvParams
332
     , pTempBeParams
333
     , pNoRemember
334
     , pStartupPaused
335
     ])
336
  , ("OpInstanceShutdown",
337
     [ pInstanceName
338
     , pForce
339
     , pIgnoreOfflineNodes
340
     , pShutdownTimeout'
341
     , pNoRemember
342
     ])
343
  , ("OpInstanceReboot",
344
     [ pInstanceName
345
     , pShutdownTimeout
346
     , pIgnoreSecondaries
347
     , pRebootType
348
     , pReason
349
     ])
350
  , ("OpInstanceMove",
351
     [ pInstanceName
352
     , pShutdownTimeout
353
     , pIgnoreIpolicy
354
     , pMoveTargetNode
355
     , pIgnoreConsistency
356
     ])
357
  , ("OpInstanceConsole",
358
     [ pInstanceName ])
359
  , ("OpInstanceActivateDisks",
360
     [ pInstanceName
361
     , pIgnoreDiskSize
362
     , pWaitForSyncFalse
363
     ])
364
  , ("OpInstanceDeactivateDisks",
365
     [ pInstanceName
366
     , pForce
367
     ])
368
  , ("OpInstanceRecreateDisks",
369
     [ pInstanceName
370
     , pRecreateDisksInfo
371
     , pNodes
372
     , pIallocator
373
     ])
374
  , ("OpInstanceQuery", dOldQuery)
375
  , ("OpInstanceQueryData",
376
     [ pUseLocking
377
     , pInstances
378
     , pStatic
379
     ])
380
  , ("OpInstanceSetParams",
381
     [ pInstanceName
382
     , pForce
383
     , pForceVariant
384
     , pIgnoreIpolicy
385
     , pInstParamsNicChanges
386
     , pInstParamsDiskChanges
387
     , pInstBeParams
388
     , pRuntimeMem
389
     , pInstHvParams
390
     , pOptDiskTemplate
391
     , pPrimaryNode
392
     , pRemoteNode
393
     , pOsNameChange
394
     , pInstOsParams
395
     , pWaitForSync
396
     , pOffline
397
     , pIpConflictsCheck
398
     ])
399
  , ("OpInstanceGrowDisk",
400
     [ pInstanceName
401
     , pWaitForSync
402
     , pDiskIndex
403
     , pDiskChgAmount
404
     , pDiskChgAbsolute
405
     ])
406
  , ("OpInstanceChangeGroup",
407
     [ pInstanceName
408
     , pEarlyRelease
409
     , pIallocator
410
     , pTargetGroups
411
     ])
412
  , ("OpGroupAdd",
413
     [ pGroupName
414
     , pNodeGroupAllocPolicy
415
     , pGroupNodeParams
416
     , pDiskParams
417
     , pHvState
418
     , pDiskState
419
     , pIpolicy
420
     ])
421
  , ("OpGroupAssignNodes",
422
     [ pGroupName
423
     , pForce
424
     , pRequiredNodes
425
     ])
426
  , ("OpGroupQuery", dOldQueryNoLocking)
427
  , ("OpGroupSetParams",
428
     [ pGroupName
429
     , pNodeGroupAllocPolicy
430
     , pGroupNodeParams
431
     , pDiskParams
432
     , pHvState
433
     , pDiskState
434
     , pIpolicy
435
     ])
436
  , ("OpGroupRemove",
437
     [ pGroupName ])
438
  , ("OpGroupRename",
439
     [ pGroupName
440
     , pNewName
441
     ])
442
  , ("OpGroupEvacuate",
443
     [ pGroupName
444
     , pEarlyRelease
445
     , pIallocator
446
     , pTargetGroups
447
     ])
448
  , ("OpOsDiagnose",
449
     [ pOutputFields
450
     , pNames ])
451
  , ("OpExtStorageDiagnose",
452
     [ pOutputFields
453
     , pNames ])
454
  , ("OpBackupQuery",
455
     [ pUseLocking
456
     , pNodes
457
     ])
458
  , ("OpBackupPrepare",
459
     [ pInstanceName
460
     , pExportMode
461
     ])
462
  , ("OpBackupExport",
463
     [ pInstanceName
464
     , pShutdownTimeout
465
     , pExportTargetNode
466
     , pShutdownInstance
467
     , pRemoveInstance
468
     , pIgnoreRemoveFailures
469
     , pExportMode
470
     , pX509KeyName
471
     , pX509DestCA
472
     ])
473
  , ("OpBackupRemove",
474
     [ pInstanceName ])
475
  , ("OpTestAllocator",
476
     [ pIAllocatorDirection
477
     , pIAllocatorMode
478
     , pIAllocatorReqName
479
     , pIAllocatorNics
480
     , pIAllocatorDisks
481
     , pHypervisor
482
     , pIallocator
483
     , pInstTags
484
     , pIAllocatorMemory
485
     , pIAllocatorVCpus
486
     , pIAllocatorOs
487
     , pDiskTemplate
488
     , pIAllocatorInstances
489
     , pIAllocatorEvacMode
490
     , pTargetGroups
491
     , pIAllocatorSpindleUse
492
     , pIAllocatorCount
493
     ])
494
  , ("OpTestJqueue",
495
     [ pJQueueNotifyWaitLock
496
     , pJQueueNotifyExec
497
     , pJQueueLogMessages
498
     , pJQueueFail
499
     ])
500
  , ("OpTestDummy",
501
     [ pTestDummyResult
502
     , pTestDummyMessages
503
     , pTestDummyFail
504
     , pTestDummySubmitJobs
505
     ])
506
  , ("OpNetworkAdd",
507
     [ pNetworkName
508
     , pNetworkAddress4
509
     , pNetworkGateway4
510
     , pNetworkAddress6
511
     , pNetworkGateway6
512
     , pNetworkMacPrefix
513
     , pNetworkAddRsvdIps
514
     , pIpConflictsCheck
515
     , pInstTags
516
     ])
517
  , ("OpNetworkRemove",
518
     [ pNetworkName
519
     , pForce
520
     ])
521
  , ("OpNetworkSetParams",
522
     [ pNetworkName
523
     , pNetworkGateway4
524
     , pNetworkAddress6
525
     , pNetworkGateway6
526
     , pNetworkMacPrefix
527
     , pNetworkAddRsvdIps
528
     , pNetworkRemoveRsvdIps
529
     ])
530
  , ("OpNetworkConnect",
531
     [ pGroupName
532
     , pNetworkName
533
     , pNetworkMode
534
     , pNetworkLink
535
     , pIpConflictsCheck
536
     ])
537
  , ("OpNetworkDisconnect",
538
     [ pGroupName
539
     , pNetworkName
540
     ])
541
  , ("OpNetworkQuery", dOldQuery)
542
  , ("OpRestrictedCommand",
543
     [ pUseLocking
544
     , pRequiredNodes
545
     , pRestrictedCommand
546
     ])
547
  ])
548

    
549
-- | Returns the OP_ID for a given opcode value.
550
$(genOpID ''OpCode "opID")
551

    
552
-- | A list of all defined/supported opcode IDs.
553
$(genAllOpIDs ''OpCode "allOpIDs")
554

    
555
instance JSON OpCode where
556
  readJSON = loadOpCode
557
  showJSON = saveOpCode
558

    
559
-- | Generates the summary value for an opcode.
560
opSummaryVal :: OpCode -> Maybe String
561
opSummaryVal OpClusterVerifyGroup { opGroupName = s } = Just (fromNonEmpty s)
562
opSummaryVal OpGroupVerifyDisks { opGroupName = s } = Just (fromNonEmpty s)
563
opSummaryVal OpClusterRename { opName = s } = Just (fromNonEmpty s)
564
opSummaryVal OpQuery { opWhat = s } = Just (queryTypeOpToRaw s)
565
opSummaryVal OpQueryFields { opWhat = s } = Just (queryTypeOpToRaw s)
566
opSummaryVal OpNodeRemove { opNodeName = s } = Just (fromNonEmpty s)
567
opSummaryVal OpNodeAdd { opNodeName = s } = Just (fromNonEmpty s)
568
opSummaryVal OpNodeModifyStorage { opNodeName = s } = Just (fromNonEmpty s)
569
opSummaryVal OpRepairNodeStorage  { opNodeName = s } = Just (fromNonEmpty s)
570
opSummaryVal OpNodeSetParams { opNodeName = s } = Just (fromNonEmpty s)
571
opSummaryVal OpNodePowercycle { opNodeName = s } = Just (fromNonEmpty s)
572
opSummaryVal OpNodeMigrate { opNodeName = s } = Just (fromNonEmpty s)
573
opSummaryVal OpNodeEvacuate { opNodeName = s } = Just (fromNonEmpty s)
574
opSummaryVal OpInstanceCreate { opInstanceName = s } = Just s
575
opSummaryVal OpInstanceReinstall { opInstanceName = s } = Just s
576
opSummaryVal OpInstanceRemove { opInstanceName = s } = Just s
577
-- FIXME: instance rename should show both names; currently it shows none
578
-- opSummaryVal OpInstanceRename { opInstanceName = s } = Just s
579
opSummaryVal OpInstanceStartup { opInstanceName = s } = Just s
580
opSummaryVal OpInstanceShutdown { opInstanceName = s } = Just s
581
opSummaryVal OpInstanceReboot { opInstanceName = s } = Just s
582
opSummaryVal OpInstanceReplaceDisks { opInstanceName = s } = Just s
583
opSummaryVal OpInstanceFailover { opInstanceName = s } = Just s
584
opSummaryVal OpInstanceMigrate { opInstanceName = s } = Just s
585
opSummaryVal OpInstanceMove { opInstanceName = s } = Just s
586
opSummaryVal OpInstanceConsole { opInstanceName = s } = Just s
587
opSummaryVal OpInstanceActivateDisks { opInstanceName = s } = Just s
588
opSummaryVal OpInstanceDeactivateDisks { opInstanceName = s } = Just s
589
opSummaryVal OpInstanceRecreateDisks { opInstanceName = s } = Just s
590
opSummaryVal OpInstanceSetParams { opInstanceName = s } = Just s
591
opSummaryVal OpInstanceGrowDisk { opInstanceName = s } = Just s
592
opSummaryVal OpInstanceChangeGroup { opInstanceName = s } = Just s
593
opSummaryVal OpGroupAdd { opGroupName = s } = Just (fromNonEmpty s)
594
opSummaryVal OpGroupAssignNodes { opGroupName = s } = Just (fromNonEmpty s)
595
opSummaryVal OpGroupSetParams { opGroupName = s } = Just (fromNonEmpty s)
596
opSummaryVal OpGroupRemove { opGroupName = s } = Just (fromNonEmpty s)
597
opSummaryVal OpGroupEvacuate { opGroupName = s } = Just (fromNonEmpty s)
598
opSummaryVal OpBackupPrepare { opInstanceName = s } = Just s
599
opSummaryVal OpBackupExport { opInstanceName = s } = Just s
600
opSummaryVal OpBackupRemove { opInstanceName = s } = Just s
601
opSummaryVal OpTagsGet { opKind = k } =
602
  Just . fromMaybe "None" $ tagNameOf k
603
opSummaryVal OpTagsSearch { opTagSearchPattern = s } = Just (fromNonEmpty s)
604
opSummaryVal OpTestDelay { opDelayDuration = d } = Just (show d)
605
opSummaryVal OpTestAllocator { opIallocator = s } =
606
  -- FIXME: Python doesn't handle None fields well, so we have behave the same
607
  Just $ maybe "None" fromNonEmpty s
608
opSummaryVal OpNetworkAdd { opNetworkName = s} = Just (fromNonEmpty s)
609
opSummaryVal OpNetworkRemove { opNetworkName = s} = Just (fromNonEmpty s)
610
opSummaryVal OpNetworkSetParams { opNetworkName = s} = Just (fromNonEmpty s)
611
opSummaryVal OpNetworkConnect { opNetworkName = s} = Just (fromNonEmpty s)
612
opSummaryVal OpNetworkDisconnect { opNetworkName = s} = Just (fromNonEmpty s)
613
opSummaryVal _ = Nothing
614

    
615
-- | Computes the summary of the opcode.
616
opSummary :: OpCode -> String
617
opSummary op =
618
  case opSummaryVal op of
619
    Nothing -> op_suffix
620
    Just s -> op_suffix ++ "(" ++ s ++ ")"
621
  where op_suffix = drop 3 $ opID op
622

    
623
-- | Generic\/common opcode parameters.
624
$(buildObject "CommonOpParams" "op"
625
  [ pDryRun
626
  , pDebugLevel
627
  , pOpPriority
628
  , pDependencies
629
  , pComment
630
  ])
631

    
632
-- | Default common parameter values.
633
defOpParams :: CommonOpParams
634
defOpParams =
635
  CommonOpParams { opDryRun     = Nothing
636
                 , opDebugLevel = Nothing
637
                 , opPriority   = OpPrioNormal
638
                 , opDepends    = Nothing
639
                 , opComment    = Nothing
640
                 }
641

    
642
-- | The top-level opcode type.
643
data MetaOpCode = MetaOpCode { metaParams :: CommonOpParams
644
                             , metaOpCode :: OpCode
645
                             } deriving (Show, Eq)
646

    
647
-- | JSON serialisation for 'MetaOpCode'.
648
showMeta :: MetaOpCode -> JSValue
649
showMeta (MetaOpCode params op) =
650
  let objparams = toDictCommonOpParams params
651
      objop = toDictOpCode op
652
  in makeObj (objparams ++ objop)
653

    
654
-- | JSON deserialisation for 'MetaOpCode'
655
readMeta :: JSValue -> Text.JSON.Result MetaOpCode
656
readMeta v = do
657
  meta <- readJSON v
658
  op <- readJSON v
659
  return $ MetaOpCode meta op
660

    
661
instance JSON MetaOpCode where
662
  showJSON = showMeta
663
  readJSON = readMeta
664

    
665
-- | Wraps an 'OpCode' with the default parameters to build a
666
-- 'MetaOpCode'.
667
wrapOpCode :: OpCode -> MetaOpCode
668
wrapOpCode = MetaOpCode defOpParams
669

    
670
-- | Sets the comment on a meta opcode.
671
setOpComment :: String -> MetaOpCode -> MetaOpCode
672
setOpComment comment (MetaOpCode common op) =
673
  MetaOpCode (common { opComment = Just comment}) op
674

    
675
-- | Sets the priority on a meta opcode.
676
setOpPriority :: OpSubmitPriority -> MetaOpCode -> MetaOpCode
677
setOpPriority prio (MetaOpCode common op) =
678
  MetaOpCode (common { opPriority = prio }) op