--
-- Copyright © 2013-2015 Anchor Systems, Pty Ltd and Others
--
-- The code in this file, and the program it is a part of, is
-- made available to you by its authors as open source software:
-- you can redistribute it and/or modify it under the terms of
-- the 3-clause BSD licence.
--
-- /Description/
-- This module exports the public-facing Ceilometer types
-- and the interface for them.
--
{-# LANGUAGE DeriveFoldable #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# OPTIONS -fno-warn-unused-binds #-}
module Ceilometer.Types
( -- * Payload Raws
PRSimple(PRSimple), prSimple
, PRCompoundEvent(PRCompoundEvent), prCompoundEvent
, PRCompoundPollster(PRCompoundPollster), prCompoundPollster
-- * Payload Decoded Fields
, PFValue, PFValue64, PFValue32, PFValueText
, PFEndpoint(..), pfEndpoint
, PFVolumeStatus(..), pfVolumeStatus
, PFVolumeVerb(..), pfVolumeVerb
, PFInstanceStatus(..), pfInstanceStatus
, PFImageStatus(..), pfImageStatus
, PFImageVerb(..), pfImageVerb
, PFSnapshotStatus(..), pfSnapshotStatus
, PFSnapshotVerb(..), pfSnapshotVerb
, PFIPStatus(..), pfIPStatus
, PFIPVerb(..), pfIPVerb
, PFIPAlloc(..), pfIPAlloc
-- * Payload Decoded Points
, PDVolume(PDVolume), pdVolume
, PDSSD(PDSSD), pdSSD
, PDCPU(PDCPU), pdCPU
, PDDiskRead(..), pdDiskRead
, PDDiskWrite(..), pdDiskWrite
, PDNeutronTx(..), pdNeutronTx
, PDNeutronRx(..), pdNeutronRx
, PDInstanceVCPU(PDInstanceVCPU), pdInstanceVCPU
, PDInstanceRAM(PDInstanceRAM), pdInstanceRAM
, PDInstanceDisk(PDInstanceDisk), pdInstanceDisk
, PDInstanceFlavor(PDInstanceFlavor), pdInstanceFlavor
, PDImage(PDImage), pdImage
, PDImagePollster(PDImagePollster), pdImagePollster
, PDSnapshot(PDSnapshot), pdSnapshot
, PDIP(PDIP), pdIP
-- * Values
, Valued, value
, Timed(Timed), time
-- * Interface
, Env(..), Filters(..)
, Flavor, FlavorMap
, siphashID
, filterByInstanceStatus
) where
import Control.Applicative
import Control.Lens hiding (Fold, Simple)
import Data.Binary (Word64)
import Data.Foldable
import Ceilometer.Types.Base
import Ceilometer.Types.CPU
import Ceilometer.Types.Disk
import Ceilometer.Types.Image
import Ceilometer.Types.Instance
import Ceilometer.Types.IP
import Ceilometer.Types.Neutron
import Ceilometer.Types.Snapshot
import Ceilometer.Types.Volume
import Vaultaire.Types
--------------------------------------------------------------------------------
-- | Information needed to parse/fold Ceilometer types, supplied by users.
--
data Env = Env { _flavormap :: FlavorMap
, _sourcedict :: SourceDict
, _filters :: Filters
, _start :: TimeStamp
, _end :: TimeStamp }
data Filters = Filters {
instanceStatusFilter :: PFInstanceStatus -> Bool
}
filterByInstanceStatus :: Filters -> (a -> PFInstanceStatus) -> a -> Bool
filterByInstanceStatus (Filters f) g = f . g
--------------------------------------------------------------------------------
-- | Values with a TimeStamp.
--
data Timed value = Timed { _time :: !Word64, _val :: value }
deriving (Show, Functor, Foldable, Traversable)
makeLenses ''Timed
-- | A family of lens that allows viewing/updating the payload value of decoded
-- Ceilometer points.
--
-- note: this is a Lens and not just a Getter since we wish to reuse the logic
-- for collector (making the points) and user (reading the points).
--
class Valued a where
type PFValue a
value :: Lens' a (PFValue a)
instance Valued a => Valued (Timed a) where
type PFValue (Timed a) = PFValue a
value f (Timed t x) = Timed t <$> value f x
instance Valued PDCPU where
type PFValue PDCPU = PFValue64
value f (PDCPU x) = PDCPU <$> f x
instance Valued PDDiskRead where
type PFValue PDDiskRead = PFValue64
value f (PDDiskRead x) = PDDiskRead <$> f x
instance Valued PDDiskWrite where
type PFValue PDDiskWrite = PFValue64
value f (PDDiskWrite x) = PDDiskWrite <$> f x
instance Valued PDNeutronTx where
type PFValue PDNeutronTx = PFValue64
value f (PDNeutronTx x) = PDNeutronTx <$> f x
instance Valued PDNeutronRx where
type PFValue PDNeutronRx = PFValue64
value f (PDNeutronRx x) = PDNeutronRx <$> f x
instance Valued PDVolume where
type PFValue PDVolume = PFValue32
value f (PDVolume a b c x) = PDVolume a b c <$> f x
instance Valued PDSSD where
type PFValue PDSSD = PFValue32
value f (PDSSD a b c x) = PDSSD a b c <$> f x
instance Valued PDInstanceFlavor where
type PFValue PDInstanceFlavor = PFValueText
value f (PDInstanceFlavor s x) = PDInstanceFlavor s <$> f x
instance Valued PDInstanceVCPU where
type PFValue PDInstanceVCPU = PFValue32
value f (PDInstanceVCPU s x) = PDInstanceVCPU s <$> f x
instance Valued PDInstanceRAM where
type PFValue PDInstanceRAM = PFValue32
value f (PDInstanceRAM s x) = PDInstanceRAM s <$> f x
instance Valued PDInstanceDisk where
type PFValue PDInstanceDisk = PFValue32
value f (PDInstanceDisk s x) = PDInstanceDisk s <$> f x
instance Valued PDImage where
type PFValue PDImage = PFValue32
value f (PDImage s v e x) = PDImage s v e <$> f x
instance Valued PDImagePollster where
type PFValue PDImagePollster = PFValue64
value f (PDImagePollster x) = PDImagePollster <$> f x
instance Valued PDSnapshot where
type PFValue PDSnapshot = PFValue32
value f (PDSnapshot a b c x) = PDSnapshot a b c <$> f x
instance Valued PDIP where
type PFValue PDIP = PFIPAlloc
value f (PDIP a b c x) = PDIP a b c <$> f x