Statistics
| Branch: | Tag: | Revision:

root / src / Ganeti / OpCodes.hs @ 423b2dd5

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
     ])
179
  , ("OpClusterRedistConf", [])
180
  , ("OpClusterActivateMasterIp", [])
181
  , ("OpClusterDeactivateMasterIp", [])
182
  , ("OpQuery",
183
     [ pQueryWhat
184
     , pUseLocking
185
     , pQueryFields
186
     , pQueryFilter
187
     ])
188
  , ("OpQueryFields",
189
     [ pQueryWhat
190
     , pQueryFields
191
     ])
192
  , ("OpOobCommand",
193
     [ pNodeNames
194
     , pOobCommand
195
     , pOobTimeout
196
     , pIgnoreStatus
197
     , pPowerDelay
198
     ])
199
  , ("OpNodeRemove", [ pNodeName ])
200
  , ("OpNodeAdd",
201
     [ pNodeName
202
     , pHvState
203
     , pDiskState
204
     , pPrimaryIp
205
     , pSecondaryIp
206
     , pReadd
207
     , pNodeGroup
208
     , pMasterCapable
209
     , pVmCapable
210
     , pNdParams
211
    ])
212
  , ("OpNodeQuery", dOldQuery)
213
  , ("OpNodeQueryvols",
214
     [ pOutputFields
215
     , pNodes
216
     ])
217
  , ("OpNodeQueryStorage",
218
     [ pOutputFields
219
     , pStorageType
220
     , pNodes
221
     , pStorageName
222
     ])
223
  , ("OpNodeModifyStorage",
224
     [ pNodeName
225
     , pStorageType
226
     , pStorageName
227
     , pStorageChanges
228
     ])
229
  , ("OpRepairNodeStorage",
230
     [ pNodeName
231
     , pStorageType
232
     , pStorageName
233
     , pIgnoreConsistency
234
     ])
235
  , ("OpNodeSetParams",
236
     [ pNodeName
237
     , pForce
238
     , pHvState
239
     , pDiskState
240
     , pMasterCandidate
241
     , pOffline
242
     , pDrained
243
     , pAutoPromote
244
     , pMasterCapable
245
     , pVmCapable
246
     , pSecondaryIp
247
     , pNdParams
248
     , pPowered
249
     ])
250
  , ("OpNodePowercycle",
251
     [ pNodeName
252
     , pForce
253
     ])
254
  , ("OpNodeMigrate",
255
     [ pNodeName
256
     , pMigrationMode
257
     , pMigrationLive
258
     , pMigrationTargetNode
259
     , pAllowRuntimeChgs
260
     , pIgnoreIpolicy
261
     , pIallocator
262
     ])
263
  , ("OpNodeEvacuate",
264
     [ pEarlyRelease
265
     , pNodeName
266
     , pRemoteNode
267
     , pIallocator
268
     , pEvacMode
269
     ])
270
  , ("OpInstanceCreate",
271
     [ pInstanceName
272
     , pForceVariant
273
     , pWaitForSync
274
     , pNameCheck
275
     , pIgnoreIpolicy
276
     , pInstBeParams
277
     , pInstDisks
278
     , pDiskTemplate
279
     , pFileDriver
280
     , pFileStorageDir
281
     , pInstHvParams
282
     , pHypervisor
283
     , pIallocator
284
     , pResetDefaults
285
     , pIpCheck
286
     , pIpConflictsCheck
287
     , pInstCreateMode
288
     , pInstNics
289
     , pNoInstall
290
     , pInstOsParams
291
     , pInstOs
292
     , pPrimaryNode
293
     , pSecondaryNode
294
     , pSourceHandshake
295
     , pSourceInstance
296
     , pSourceShutdownTimeout
297
     , pSourceX509Ca
298
     , pSrcNode
299
     , pSrcPath
300
     , pStartInstance
301
     , pOpportunisticLocking
302
     , pInstTags
303
     ])
304
  , ("OpInstanceMultiAlloc",
305
     [ pIallocator
306
     , pMultiAllocInstances
307
     , pOpportunisticLocking
308
     ])
309
  , ("OpInstanceReinstall",
310
     [ pInstanceName
311
     , pForceVariant
312
     , pInstOs
313
     , pTempOsParams
314
     ])
315
  , ("OpInstanceRemove",
316
     [ pInstanceName
317
     , pShutdownTimeout
318
     , pIgnoreFailures
319
     ])
320
  , ("OpInstanceRename",
321
     [ pInstanceName
322
     , pNewName
323
     , pNameCheck
324
     , pIpCheck
325
     ])
326
  , ("OpInstanceStartup",
327
     [ pInstanceName
328
     , pForce
329
     , pIgnoreOfflineNodes
330
     , pTempHvParams
331
     , pTempBeParams
332
     , pNoRemember
333
     , pStartupPaused
334
     ])
335
  , ("OpInstanceShutdown",
336
     [ pInstanceName
337
     , pForce
338
     , pIgnoreOfflineNodes
339
     , pShutdownTimeout'
340
     , pNoRemember
341
     ])
342
  , ("OpInstanceReboot",
343
     [ pInstanceName
344
     , pShutdownTimeout
345
     , pIgnoreSecondaries
346
     , pRebootType
347
     , pReason
348
     ])
349
  , ("OpInstanceMove",
350
     [ pInstanceName
351
     , pShutdownTimeout
352
     , pIgnoreIpolicy
353
     , pMoveTargetNode
354
     , pIgnoreConsistency
355
     ])
356
  , ("OpInstanceConsole",
357
     [ pInstanceName ])
358
  , ("OpInstanceActivateDisks",
359
     [ pInstanceName
360
     , pIgnoreDiskSize
361
     , pWaitForSyncFalse
362
     ])
363
  , ("OpInstanceDeactivateDisks",
364
     [ pInstanceName
365
     , pForce
366
     ])
367
  , ("OpInstanceRecreateDisks",
368
     [ pInstanceName
369
     , pRecreateDisksInfo
370
     , pNodes
371
     , pIallocator
372
     ])
373
  , ("OpInstanceQuery", dOldQuery)
374
  , ("OpInstanceQueryData",
375
     [ pUseLocking
376
     , pInstances
377
     , pStatic
378
     ])
379
  , ("OpInstanceSetParams",
380
     [ pInstanceName
381
     , pForce
382
     , pForceVariant
383
     , pIgnoreIpolicy
384
     , pInstParamsNicChanges
385
     , pInstParamsDiskChanges
386
     , pInstBeParams
387
     , pRuntimeMem
388
     , pInstHvParams
389
     , pOptDiskTemplate
390
     , pRemoteNode
391
     , pOsNameChange
392
     , pInstOsParams
393
     , pWaitForSync
394
     , pOffline
395
     , pIpConflictsCheck
396
     ])
397
  , ("OpInstanceGrowDisk",
398
     [ pInstanceName
399
     , pWaitForSync
400
     , pDiskIndex
401
     , pDiskChgAmount
402
     , pDiskChgAbsolute
403
     ])
404
  , ("OpInstanceChangeGroup",
405
     [ pInstanceName
406
     , pEarlyRelease
407
     , pIallocator
408
     , pTargetGroups
409
     ])
410
  , ("OpGroupAdd",
411
     [ pGroupName
412
     , pNodeGroupAllocPolicy
413
     , pGroupNodeParams
414
     , pDiskParams
415
     , pHvState
416
     , pDiskState
417
     , pIpolicy
418
     ])
419
  , ("OpGroupAssignNodes",
420
     [ pGroupName
421
     , pForce
422
     , pRequiredNodes
423
     ])
424
  , ("OpGroupQuery", dOldQueryNoLocking)
425
  , ("OpGroupSetParams",
426
     [ pGroupName
427
     , pNodeGroupAllocPolicy
428
     , pGroupNodeParams
429
     , pDiskParams
430
     , pHvState
431
     , pDiskState
432
     , pIpolicy
433
     ])
434
  , ("OpGroupRemove",
435
     [ pGroupName ])
436
  , ("OpGroupRename",
437
     [ pGroupName
438
     , pNewName
439
     ])
440
  , ("OpGroupEvacuate",
441
     [ pGroupName
442
     , pEarlyRelease
443
     , pIallocator
444
     , pTargetGroups
445
     ])
446
  , ("OpOsDiagnose",
447
     [ pOutputFields
448
     , pNames ])
449
  , ("OpExtStorageDiagnose",
450
     [ pOutputFields
451
     , pNames ])
452
  , ("OpBackupQuery",
453
     [ pUseLocking
454
     , pNodes
455
     ])
456
  , ("OpBackupPrepare",
457
     [ pInstanceName
458
     , pExportMode
459
     ])
460
  , ("OpBackupExport",
461
     [ pInstanceName
462
     , pShutdownTimeout
463
     , pExportTargetNode
464
     , pShutdownInstance
465
     , pRemoveInstance
466
     , pIgnoreRemoveFailures
467
     , pExportMode
468
     , pX509KeyName
469
     , pX509DestCA
470
     ])
471
  , ("OpBackupRemove",
472
     [ pInstanceName ])
473
  , ("OpTestAllocator",
474
     [ pIAllocatorDirection
475
     , pIAllocatorMode
476
     , pIAllocatorReqName
477
     , pIAllocatorNics
478
     , pIAllocatorDisks
479
     , pHypervisor
480
     , pIallocator
481
     , pInstTags
482
     , pIAllocatorMemory
483
     , pIAllocatorVCpus
484
     , pIAllocatorOs
485
     , pDiskTemplate
486
     , pIAllocatorInstances
487
     , pIAllocatorEvacMode
488
     , pTargetGroups
489
     , pIAllocatorSpindleUse
490
     , pIAllocatorCount
491
     ])
492
  , ("OpTestJqueue",
493
     [ pJQueueNotifyWaitLock
494
     , pJQueueNotifyExec
495
     , pJQueueLogMessages
496
     , pJQueueFail
497
     ])
498
  , ("OpTestDummy",
499
     [ pTestDummyResult
500
     , pTestDummyMessages
501
     , pTestDummyFail
502
     , pTestDummySubmitJobs
503
     ])
504
  , ("OpNetworkAdd",
505
     [ pNetworkName
506
     , pNetworkAddress4
507
     , pNetworkGateway4
508
     , pNetworkAddress6
509
     , pNetworkGateway6
510
     , pNetworkMacPrefix
511
     , pNetworkAddRsvdIps
512
     , pIpConflictsCheck
513
     , pInstTags
514
     ])
515
  , ("OpNetworkRemove",
516
     [ pNetworkName
517
     , pForce
518
     ])
519
  , ("OpNetworkSetParams",
520
     [ pNetworkName
521
     , pNetworkGateway4
522
     , pNetworkAddress6
523
     , pNetworkGateway6
524
     , pNetworkMacPrefix
525
     , pNetworkAddRsvdIps
526
     , pNetworkRemoveRsvdIps
527
     ])
528
  , ("OpNetworkConnect",
529
     [ pGroupName
530
     , pNetworkName
531
     , pNetworkMode
532
     , pNetworkLink
533
     , pIpConflictsCheck
534
     ])
535
  , ("OpNetworkDisconnect",
536
     [ pGroupName
537
     , pNetworkName
538
     ])
539
  , ("OpNetworkQuery", dOldQuery)
540
  , ("OpRestrictedCommand",
541
     [ pUseLocking
542
     , pRequiredNodes
543
     , pRestrictedCommand
544
     ])
545
  ])
546

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

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

    
553
instance JSON OpCode where
554
  readJSON = loadOpCode
555
  showJSON = saveOpCode
556

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

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

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

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

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

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

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

    
659
instance JSON MetaOpCode where
660
  showJSON = showMeta
661
  readJSON = readMeta
662

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

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

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