Statistics
| Branch: | Tag: | Revision:

root / src / Ganeti / OpCodes.hs @ 06c2fb4a

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

    
557
-- | Returns the OP_ID for a given opcode value.
558
$(genOpID ''OpCode "opID")
559

    
560
-- | A list of all defined/supported opcode IDs.
561
$(genAllOpIDs ''OpCode "allOpIDs")
562

    
563
instance JSON OpCode where
564
  readJSON = loadOpCode
565
  showJSON = saveOpCode
566

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

    
624
-- | Computes the summary of the opcode.
625
opSummary :: OpCode -> String
626
opSummary op =
627
  case opSummaryVal op of
628
    Nothing -> op_suffix
629
    Just s -> op_suffix ++ "(" ++ s ++ ")"
630
  where op_suffix = drop 3 $ opID op
631

    
632
-- | Generic\/common opcode parameters.
633
$(buildObject "CommonOpParams" "op"
634
  [ pDryRun
635
  , pDebugLevel
636
  , pOpPriority
637
  , pDependencies
638
  , pComment
639
  , pReason
640
  ])
641

    
642
-- | Default common parameter values.
643
defOpParams :: CommonOpParams
644
defOpParams =
645
  CommonOpParams { opDryRun     = Nothing
646
                 , opDebugLevel = Nothing
647
                 , opPriority   = OpPrioNormal
648
                 , opDepends    = Nothing
649
                 , opComment    = Nothing
650
                 , opReason     = []
651
                 }
652

    
653
-- | The top-level opcode type.
654
data MetaOpCode = MetaOpCode { metaParams :: CommonOpParams
655
                             , metaOpCode :: OpCode
656
                             } deriving (Show, Eq)
657

    
658
-- | JSON serialisation for 'MetaOpCode'.
659
showMeta :: MetaOpCode -> JSValue
660
showMeta (MetaOpCode params op) =
661
  let objparams = toDictCommonOpParams params
662
      objop = toDictOpCode op
663
  in makeObj (objparams ++ objop)
664

    
665
-- | JSON deserialisation for 'MetaOpCode'
666
readMeta :: JSValue -> Text.JSON.Result MetaOpCode
667
readMeta v = do
668
  meta <- readJSON v
669
  op <- readJSON v
670
  return $ MetaOpCode meta op
671

    
672
instance JSON MetaOpCode where
673
  showJSON = showMeta
674
  readJSON = readMeta
675

    
676
-- | Wraps an 'OpCode' with the default parameters to build a
677
-- 'MetaOpCode'.
678
wrapOpCode :: OpCode -> MetaOpCode
679
wrapOpCode = MetaOpCode defOpParams
680

    
681
-- | Sets the comment on a meta opcode.
682
setOpComment :: String -> MetaOpCode -> MetaOpCode
683
setOpComment comment (MetaOpCode common op) =
684
  MetaOpCode (common { opComment = Just comment}) op
685

    
686
-- | Sets the priority on a meta opcode.
687
setOpPriority :: OpSubmitPriority -> MetaOpCode -> MetaOpCode
688
setOpPriority prio (MetaOpCode common op) =
689
  MetaOpCode (common { opPriority = prio }) op