protected override void ProcessRecord()
        {
            base.ProcessRecord();
            ListBootVolumeAttachmentsRequest request;

            try
            {
                request = new ListBootVolumeAttachmentsRequest
                {
                    AvailabilityDomain = AvailabilityDomain,
                    CompartmentId      = CompartmentId,
                    Limit        = Limit,
                    Page         = Page,
                    InstanceId   = InstanceId,
                    BootVolumeId = BootVolumeId
                };
                IEnumerable <ListBootVolumeAttachmentsResponse> responses = GetRequestDelegate().Invoke(request);
                foreach (var item in responses)
                {
                    response = item;
                    WriteOutput(response, response.Items, true);
                }
                if (!ParameterSetName.Equals(AllPageSet) && !ParameterSetName.Equals(LimitSet) && response.OpcNextPage != null)
                {
                    WriteWarning("This operation supports pagination and not all resources were returned. Re-run using the -All option to auto paginate and list all resources.");
                }
                FinishProcessing(response);
            }
            catch (Exception ex)
            {
                TerminatingErrorDuringExecution(ex);
            }
        }
        protected override void ProcessRecord()
        {
            base.ProcessRecord();
            ListBootVolumeAttachmentsRequest request;

            try
            {
                request = new ListBootVolumeAttachmentsRequest
                {
                    AvailabilityDomain = AvailabilityDomain,
                    CompartmentId      = CompartmentId,
                    Limit        = Limit,
                    Page         = Page,
                    InstanceId   = InstanceId,
                    BootVolumeId = BootVolumeId
                };
                IEnumerable <ListBootVolumeAttachmentsResponse> responses = GetRequestDelegate().Invoke(request);
                foreach (var item in responses)
                {
                    response = item;
                    WriteOutput(response, response.Items, true);
                }
                FinishProcessing(response);
            }
            catch (Exception ex)
            {
                TerminatingErrorDuringExecution(ex);
            }
        }
        /// <summary>
        /// Lists the VNIC attachments in the specified compartment.
        /// A VNIC attachment resides in the same compartment as the attached instance.
        /// The list can be filtered by instance, VNIC, or availability domain.
        /// </summary>
        /// <param name="listRequest"></param>
        /// <returns></returns>
        public ListBootVolumeAttachmentsResponse ListBootVolumeAttachments(ListBootVolumeAttachmentsRequest listRequest)
        {
            var uri = new Uri($"{GetEndPoint(CoreServices.BootVolumeAttachment, this.Region)}?{listRequest.GetOptionQuery()}");

            var webResponse = this.RestClient.Get(uri);

            using (var stream = webResponse.GetResponseStream())
                using (var reader = new StreamReader(stream))
                {
                    var response = reader.ReadToEnd();

                    return(new ListBootVolumeAttachmentsResponse()
                    {
                        Items = this.JsonSerializer.Deserialize <List <BootVolumeAttachment> >(response),
                        OpcRequestId = webResponse.Headers.Get("opc-request-id"),
                        OpcNextPage = webResponse.Headers.Get("opc-next-page")
                    });
                }
        }
        public static void InstanceConsoleDisplay(ClientConfig config)
        {
            // create client
            ComputeClient computeClient = new ComputeClient(config)
            {
                Region = Regions.US_ASHBURN_1
            };

            BlockstorageClient blockstorageClient = new BlockstorageClient(config)
            {
                Region = Regions.US_ASHBURN_1
            };

            VirtualNetworkClient networkingClient = new VirtualNetworkClient(config)
            {
                Region = Regions.US_ASHBURN_1
            };

            // get instanse list(RUNNING only)
            Console.WriteLine("* List Instance------------------------");
            var listInstanceRequest = new ListInstancesRequest()
            {
                // target compartment is root compartment(tenancy)
                CompartmentId  = computeClient.Config.TenancyId,
                Limit          = 50,
                LifecycleState = ListInstancesRequest.LifecycleStates.RUNNING,
                SortOrder      = SortOrder.ASC,
                SortBy         = ListInstancesRequest.SortByParam.TIMECREATED
            };
            // get instance
            var listInstance = computeClient.ListInstances(listInstanceRequest);

            listInstance.Items.ForEach(instance => {
                GetInstanceRequest getInstanceRequest = new GetInstanceRequest()
                {
                    InstanceId = instance.Id
                };
                var insDetail = computeClient.GetInstance(getInstanceRequest).Instance;
                Console.WriteLine(" |-" + insDetail.DisplayName);
                Console.WriteLine(" | id: " + insDetail.Id);
                Console.WriteLine(" | AD: " + insDetail.AvailabilityDomain);
                Console.WriteLine(" | shape: " + insDetail.Shape);
                Console.WriteLine(" | state: " + insDetail.LifecycleState);
                Console.WriteLine(" |\t|- * SourceDetails");
                Console.WriteLine(" |\t|\t type: " + insDetail.SourceDetails.SourceType);
                if ("image".Equals(insDetail.SourceDetails.SourceType))
                {
                    Console.WriteLine(" |\t|\t id: " + insDetail.SourceDetails.ImageId);

                    // get sourceDetail machine image
                    GetImageRequest getImageRequest = new GetImageRequest()
                    {
                        ImageId = insDetail.SourceDetails.ImageId
                    };
                    var machineimage = computeClient.GetImage(getImageRequest);
                    Console.WriteLine(" |\t|\t name: " + machineimage.Image.DisplayName);
                    Console.WriteLine(" |\t|\t sizeInMBs: " + machineimage.Image.SizeInMBs);
                }
                else
                {
                    Console.WriteLine(" |\t|\t id: " + insDetail.SourceDetails.BootVolumeId);

                    // get sourceDetail bootVolume
                    GetBootVolumeRequest getBootVolumeRequest = new GetBootVolumeRequest()
                    {
                        BootVolumeId = insDetail.SourceDetails.BootVolumeId
                    };
                    var bootvol = blockstorageClient.GetBootVolume(getBootVolumeRequest);
                    Console.WriteLine(" |\t|\t name: " + bootvol.BootVolume.DisplayName);
                    Console.WriteLine(" |\t|\t sizeInGBs: " + bootvol.BootVolume.SizeInGBs.Value);
                }

                // get instance atattch bootvolumes
                var bootvolumeAtattch = new ListBootVolumeAttachmentsRequest()
                {
                    InstanceId         = instance.Id,
                    CompartmentId      = instance.CompartmentId,
                    AvailabilityDomain = instance.AvailabilityDomain,
                    Limit = 50
                };
                var listBvAtattch = computeClient.ListBootVolumeAttachments(bootvolumeAtattch);
                listBvAtattch.Items.ForEach(bootVolAtt => {
                    Console.WriteLine(" |\t|- * BootVolume");

                    // get bootvolume
                    var getBootVolumeRequest = new GetBootVolumeRequest()
                    {
                        BootVolumeId = bootVolAtt.BootVolumeId
                    };
                    var bv = blockstorageClient.GetBootVolume(getBootVolumeRequest);
                    Console.WriteLine(" |\t|\t name:" + bv.BootVolume.DisplayName);
                    Console.WriteLine(" |\t|\t id:" + bv.BootVolume.Id);
                    Console.WriteLine(" |\t|\t state:" + bv.BootVolume.LifecycleState);
                    Console.WriteLine(" |\t|\t sizeInGBs:" + bv.BootVolume.SizeInGBs.Value);
                });

                // get instance atattch vnics
                var vnicAtattch = new ListVnicAttachmentsRequest()
                {
                    InstanceId         = instance.Id,
                    CompartmentId      = instance.CompartmentId,
                    AvailabilityDomain = instance.AvailabilityDomain,
                    Limit = 50
                };
                var listVnicAtattch = computeClient.ListVnicAttachments(vnicAtattch);
                listVnicAtattch.Items.ForEach(vnicA => {
                    Console.WriteLine(" |\t|- * Vnic");
                    GetVnicRequest getVnicRequest = new GetVnicRequest()
                    {
                        VnicId = vnicA.VnicId
                    };
                    var vnic = networkingClient.GetVnic(getVnicRequest);
                    Console.WriteLine(" |\t|\t name:" + vnic.Vnic.DisplayName);
                    Console.WriteLine(" |\t|\t id:" + vnic.Vnic.Id);
                    Console.WriteLine(" |\t|\t state:" + vnic.Vnic.LifecycleState);
                    Console.WriteLine(" |\t|\t privateIp:" + vnic.Vnic.PrivateIp);
                    Console.WriteLine(" |\t|\t publicIp:" + vnic.Vnic.PublicIp);
                });

                // get instance atattch volumes
                var volumeAtattch = new ListVolumeAttachmentsRequest()
                {
                    InstanceId         = instance.Id,
                    CompartmentId      = instance.CompartmentId,
                    AvailabilityDomain = instance.AvailabilityDomain,
                    Limit = 50
                };
                var listVolAtattch = computeClient.ListVolumeAttachments(volumeAtattch);
                listVolAtattch.Items.ForEach(volAtt => {
                    Console.WriteLine(" |\t|- * Volume");

                    // get bootvolume
                    var getVolumeRequest = new GetVolumeRequest()
                    {
                        VolumeId = volAtt.VolumeId
                    };
                    var vol = blockstorageClient.GetVolume(getVolumeRequest);
                    Console.WriteLine(" |\t|\t name:" + vol.Volume.DisplayName);
                    Console.WriteLine(" |\t|\t id:" + vol.Volume.Id);
                    Console.WriteLine(" |\t|\t state:" + vol.Volume.LifecycleState);
                    Console.WriteLine(" |\t|\t sizeInGBs:" + vol.Volume.SizeInGBs.Value);
                });
            });

            // get list Machine Images
            Console.WriteLine();
            Console.WriteLine("* List Image------------------------ max 10");
            var listImagesRequest = new ListImagesRequest()
            {
                // target compartment is root compartment(tenancy)
                CompartmentId  = config.TenancyId,
                Limit          = 10,
                LifecycleState = ListImagesRequest.LifecycleStates.AVAILABLE,
                SortOrder      = SortOrder.ASC,
                SortBy         = ListImagesRequest.SortByParam.TIMECREATED
            };
            // get instance
            var listImage = computeClient.ListImages(listImagesRequest);

            listImage.Items.ForEach(image =>
            {
                Console.WriteLine(" |-" + image.DisplayName);
                Console.WriteLine(" | id: " + image.Id);
                Console.WriteLine(" | os: " + image.OperatingSystem);
                Console.WriteLine(" | os ver: " + image.OperatingSystemVersion);
                Console.WriteLine(" | lifecycle: " + image.LifecycleState);
                Console.WriteLine(" | sizeInMBs: " + image.SizeInMBs);
                Console.WriteLine(" | BaseMachineId: " + image.BaseImageId);
            });
        }