hadoop-rpc-0.1.0.0: src/Data/Hadoop/Protobuf/Hdfs.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
module Data.Hadoop.Protobuf.Hdfs where
import Data.ByteString (ByteString)
import Data.ProtocolBuffers
import Data.ProtocolBuffers.Orphans ()
import Data.Text (Text)
import Data.Word (Word32, Word64)
import GHC.Generics (Generic)
import Data.Hadoop.Protobuf.Security
------------------------------------------------------------------------
-- | Summary of a file or directory
data ContentSummary = ContentSummary
{ csLength :: Required 1 (Value Word64)
, csFileCount :: Required 2 (Value Word64)
, csDirectoryCount :: Required 3 (Value Word64)
, csQuota :: Required 4 (Value Word64)
, csSpaceConsumed :: Required 5 (Value Word64)
, csSpaceQuota :: Required 6 (Value Word64)
} deriving (Generic, Show)
instance Encode ContentSummary
instance Decode ContentSummary
------------------------------------------------------------------------
-- | Directory listing.
data DirectoryListing = DirectoryListing
{ dlPartialListing :: Repeated 1 (Message FileStatus)
, dlRemaingEntries :: Required 2 (Value Word32)
} deriving (Generic, Show)
instance Encode DirectoryListing
instance Decode DirectoryListing
------------------------------------------------------------------------
-- | Status of a file, directory or symbolic link. Optionally includes a
-- files block locations if requested by client on the RPC call.
data FileStatus = FileStatus
{ fsFileType :: Required 1 (Enumeration FileType)
, fsPath :: Required 2 (Value ByteString) -- ^ local name of inode (encoded java utf8)
, fsLength :: Required 3 (Value Word64)
, fsPermission :: Required 4 (Message FilePermission)
, fsOwner :: Required 5 (Value Text)
, fsGroup :: Required 6 (Value Text)
, fsModificationTime :: Required 7 (Value Word64)
, fsAccessTime :: Required 8 (Value Word64)
-- Optional fields for symlink
, fsSymLink :: Optional 9 (Value ByteString) -- ^ if symlink, target (encoded java utf8)
-- Optional fields for file
, fsBlockReplication :: Optional 10 (Value Word32) -- ^ default = 0, only 16bits used
, fsBlockSize :: Optional 11 (Value Word64) -- ^ default = 0
, fsLocations :: Optional 12 (Message LocatedBlocks) -- ^ supplied only if asked by client
} deriving (Generic, Show)
instance Encode FileStatus
instance Decode FileStatus
------------------------------------------------------------------------
-- | The type of a file (either directory, file or symbolic link)
data FileType = IS_DIR | IS_FILE | IS_SYMLINK
deriving (Generic, Show, Eq)
instance Enum FileType where
toEnum n = case n of
1 -> IS_DIR
2 -> IS_FILE
3 -> IS_SYMLINK
_ -> error $ "FileType.toEnum: invalid enum value <" ++ show n ++ ">"
fromEnum e = case e of
IS_DIR -> 1
IS_FILE -> 2
IS_SYMLINK -> 3
------------------------------------------------------------------------
data ChecksumType = CHECKSUM_NULL | CHECKSUM_CRC32 | CHECKSUM_CRC32C
deriving (Generic, Show, Eq)
instance Enum ChecksumType where
toEnum n = case n of
0 -> CHECKSUM_NULL
1 -> CHECKSUM_CRC32
2 -> CHECKSUM_CRC32C
_ -> error $ "ChecksumType.toEnum: invalid enum value <" ++ show n ++ ">"
fromEnum e = case e of
CHECKSUM_NULL -> 0
CHECKSUM_CRC32 -> 1
CHECKSUM_CRC32C -> 2
instance Encode ChecksumType
instance Decode ChecksumType
------------------------------------------------------------------------
-- | File or directory permission, same spec as POSIX.
data FilePermission = FilePermission
{ fpPerm :: Required 1 (Value Word32) -- ^ actually a short, only 16 bits used
} deriving (Generic, Show)
instance Encode FilePermission
instance Decode FilePermission
------------------------------------------------------------------------
-- | A set of file blocks and their locations.
data LocatedBlocks = LocatedBlocks
{ lbFileLength :: Required 1 (Value Word64)
, lbBlocks :: Repeated 2 (Message LocatedBlock)
, lbUnderConstruction :: Required 3 (Value Bool)
, lbLastBlock :: Optional 4 (Message LocatedBlock)
, lbLastBlockComplete :: Required 5 (Value Bool)
} deriving (Generic, Show)
instance Encode LocatedBlocks
instance Decode LocatedBlocks
------------------------------------------------------------------------
-- | Information about a block and its location.
data LocatedBlock = LocatedBlock
{ lbExtended :: Required 1 (Message ExtendedBlock)
, lbOffset :: Required 2 (Value Word64) -- ^ offset of first byte of block in the file
, lbLocations :: Repeated 3 (Message DataNodeInfo) -- ^ locations ordered by proximity to client IP
-- | `True` if all replicas of a block are corrupt. If the block has a few corrupt replicas,
-- they are filtered and their locations are not part of this object.
, lbCorrupt :: Required 4 (Value Bool)
, lbToken :: Required 5 (Message Token)
} deriving (Generic, Show)
instance Encode LocatedBlock
instance Decode LocatedBlock
------------------------------------------------------------------------
-- | Identifies a block.
data ExtendedBlock = ExtendedBlock
{ ebPoolId :: Required 1 (Value Text) -- ^ block pool id - globally unique across clusters
, ebBlockId :: Required 2 (Value Word64) -- ^ the local id within a pool
, ebGenerationStamp :: Required 3 (Value Word64)
, ebNumBytes :: Optional 4 (Value Word64) -- ^ does not belong, here for historical reasons
} deriving (Generic, Show)
instance Encode ExtendedBlock
instance Decode ExtendedBlock
------------------------------------------------------------------------
-- | Status of a data node.
data DataNodeInfo = DataNodeInfo
{ dnId :: Required 1 (Message DataNodeId)
, dnCapacity :: Optional 2 (Value Word64) -- ^ default = 0
, dnDfsUsed :: Optional 3 (Value Word64) -- ^ default = 0
, dnRemaining :: Optional 4 (Value Word64) -- ^ default = 0
, dnBlockPoolUsed :: Optional 5 (Value Word64) -- ^ default = 0
, dnLastUpdate :: Optional 6 (Value Word64) -- ^ default = 0
, dnXceiverCount :: Optional 7 (Value Word32) -- ^ default = 0
, dnLocation :: Optional 8 (Value Text)
, dnAdminState :: Optional 9 (Enumeration AdminState) -- ^ default = NORMAL
} deriving (Generic, Show)
instance Encode DataNodeInfo
instance Decode DataNodeInfo
------------------------------------------------------------------------
data AdminState = NORMAL | DECOMMISSION_INPROGRESS | DECOMMISSIONED
deriving (Generic, Show, Eq)
instance Enum AdminState where
toEnum n = case n of
0 -> NORMAL
1 -> DECOMMISSION_INPROGRESS
2 -> DECOMMISSIONED
_ -> error $ "AdminState.toEnum: invalid enum value <" ++ show n ++ ">"
fromEnum e = case e of
NORMAL -> 0
DECOMMISSION_INPROGRESS -> 1
DECOMMISSIONED -> 2
------------------------------------------------------------------------
-- | Identifies a data node
data DataNodeId = DataNodeId
{ dnIpAddr :: Required 1 (Value Text) -- ^ IP address
, dnHostName :: Required 2 (Value Text) -- ^ Host name
, dnStorageId :: Required 3 (Value Text) -- ^ Storage ID
, dnXferPort :: Required 4 (Value Word32) -- ^ Data streaming port
, dnInfoPort :: Required 5 (Value Word32) -- ^ Info server port
, dnIpcPort :: Required 6 (Value Word32) -- ^ IPC server port
} deriving (Generic, Show)
instance Encode DataNodeId
instance Decode DataNodeId
------------------------------------------------------------------------
-- BlockTokenId was moved to Security.Token in protocol version 9