syntax = "proto3";

option go_package = "github.com/opencord/device-management-interface/v3/go/dmi";
package dmi;

import "dmi/commons.proto";

// Protos for modeling a software image and it's status

message ImageVersion {
    string image_name = 1;
    string version = 2;
}

message ImageInformation {
    ImageVersion image = 1;
    // Script used by the device specific managers to install the image.
    // Script must be included in the object downloaded from the image_url
    string image_install_script = 2;
    // Location of the image and installation script, authentication (user/pass) if any should be in the url string
    // The image_url would contain the protocol, credentials, the IP address/DNS of the server and the path of the file
    // e.g. sftp://download_user:download_pass@192.168.0.1:22/images/image1
    string image_url = 3;
    // SHA-256 sum of the image (sha256sum on Linux)
    string sha256sum = 5;
}

message ImageStatus {
    enum ImageState {
        UNDEFINED_STATE = 0; // Initial state
        COPYING_IMAGE = 1; // Downloading the image on the standby partition
        INSTALLING_IMAGE = 2; // Installing the image on the standby partition
        COMMITTING_IMAGE = 3; // Committing the image and marking it as the active partition
        REBOOTING_DEVICE = 4; // Rebooting the device
        UPGRADE_COMPLETE = 5; // Image upgrade on the standby partition completed
        UPGRADE_FAILED = 6; // Image upgrade on the standby partition failed
        ACTIVATION_COMPLETE = 7; // Image activation completed
        ACTIVATION_FAILED = 8; // Image activation failed
    }

    enum Reason {
        UNDEFINED_REASON = 0;
        ERROR_IN_REQUEST = 1;
        INTERNAL_ERROR = 2;
        DEVICE_IN_WRONG_STATE = 3;
        INVALID_IMAGE = 4;
        WRONG_IMAGE_CHECKSUM = 5;
        OPERATION_ALREADY_IN_PROGRESS = 6;
        UNKNOWN_DEVICE = 7;
        // The DM implementations should have retry mechanisms (timeout values dependant on specific implementations)
        // and even after those if the operation cannot be completed/reached then return error with reason as DEVICE_NOT_REACHABLE
        DEVICE_NOT_REACHABLE = 8;
    }

    Status status  = 1;
    Reason reason = 2;
    ImageState state = 3;
    // description contains more information about the current state of the procedure and is device dependant
    string description = 4;
    string reason_detail = 5;
}
