// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/cloud/asset/v1p2beta1/assets.proto

package asset

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	any "github.com/golang/protobuf/ptypes/any"
	_struct "github.com/golang/protobuf/ptypes/struct"
	timestamp "github.com/golang/protobuf/ptypes/timestamp"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	v1 "google.golang.org/genproto/googleapis/iam/v1"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// Temporal asset. In addition to the asset, the temporal asset includes the
// status of the asset and valid from and to time of it.
type TemporalAsset struct {
	// The time window when the asset data and state was observed.
	Window *TimeWindow `protobuf:"bytes,1,opt,name=window,proto3" json:"window,omitempty"`
	// If the asset is deleted or not.
	Deleted bool `protobuf:"varint,2,opt,name=deleted,proto3" json:"deleted,omitempty"`
	// Asset.
	Asset                *Asset   `protobuf:"bytes,3,opt,name=asset,proto3" json:"asset,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *TemporalAsset) Reset()         { *m = TemporalAsset{} }
func (m *TemporalAsset) String() string { return proto.CompactTextString(m) }
func (*TemporalAsset) ProtoMessage()    {}
func (*TemporalAsset) Descriptor() ([]byte, []int) {
	return fileDescriptor_723f69529b7a1cc3, []int{0}
}

func (m *TemporalAsset) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TemporalAsset.Unmarshal(m, b)
}
func (m *TemporalAsset) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TemporalAsset.Marshal(b, m, deterministic)
}
func (m *TemporalAsset) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TemporalAsset.Merge(m, src)
}
func (m *TemporalAsset) XXX_Size() int {
	return xxx_messageInfo_TemporalAsset.Size(m)
}
func (m *TemporalAsset) XXX_DiscardUnknown() {
	xxx_messageInfo_TemporalAsset.DiscardUnknown(m)
}

var xxx_messageInfo_TemporalAsset proto.InternalMessageInfo

func (m *TemporalAsset) GetWindow() *TimeWindow {
	if m != nil {
		return m.Window
	}
	return nil
}

func (m *TemporalAsset) GetDeleted() bool {
	if m != nil {
		return m.Deleted
	}
	return false
}

func (m *TemporalAsset) GetAsset() *Asset {
	if m != nil {
		return m.Asset
	}
	return nil
}

// A time window of (start_time, end_time].
type TimeWindow struct {
	// Start time of the time window (exclusive).
	StartTime *timestamp.Timestamp `protobuf:"bytes,1,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"`
	// End time of the time window (inclusive).
	// Current timestamp if not specified.
	EndTime              *timestamp.Timestamp `protobuf:"bytes,2,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *TimeWindow) Reset()         { *m = TimeWindow{} }
func (m *TimeWindow) String() string { return proto.CompactTextString(m) }
func (*TimeWindow) ProtoMessage()    {}
func (*TimeWindow) Descriptor() ([]byte, []int) {
	return fileDescriptor_723f69529b7a1cc3, []int{1}
}

func (m *TimeWindow) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TimeWindow.Unmarshal(m, b)
}
func (m *TimeWindow) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TimeWindow.Marshal(b, m, deterministic)
}
func (m *TimeWindow) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TimeWindow.Merge(m, src)
}
func (m *TimeWindow) XXX_Size() int {
	return xxx_messageInfo_TimeWindow.Size(m)
}
func (m *TimeWindow) XXX_DiscardUnknown() {
	xxx_messageInfo_TimeWindow.DiscardUnknown(m)
}

var xxx_messageInfo_TimeWindow proto.InternalMessageInfo

func (m *TimeWindow) GetStartTime() *timestamp.Timestamp {
	if m != nil {
		return m.StartTime
	}
	return nil
}

func (m *TimeWindow) GetEndTime() *timestamp.Timestamp {
	if m != nil {
		return m.EndTime
	}
	return nil
}

// Cloud asset. This includes all Google Cloud Platform resources,
// Cloud IAM policies, and other non-GCP assets.
type Asset struct {
	// The full name of the asset. For example:
	// `//compute.googleapis.com/projects/my_project_123/zones/zone1/instances/instance1`.
	// See [Resource
	// Names](https://cloud.google.com/apis/design/resource_names#full_resource_name)
	// for more information.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Type of the asset. Example: "compute.googleapis.com/Disk".
	AssetType string `protobuf:"bytes,2,opt,name=asset_type,json=assetType,proto3" json:"asset_type,omitempty"`
	// Representation of the resource.
	Resource *Resource `protobuf:"bytes,3,opt,name=resource,proto3" json:"resource,omitempty"`
	// Representation of the actual Cloud IAM policy set on a cloud resource. For
	// each resource, there must be at most one Cloud IAM policy set on it.
	IamPolicy *v1.Policy `protobuf:"bytes,4,opt,name=iam_policy,json=iamPolicy,proto3" json:"iam_policy,omitempty"`
	// Cloud IAM policy name of the Cloud IAM policy set on a cloud resource. For
	// each resource, there must be at most one Cloud IAM policy name associated
	// with it.
	IamPolicyName []byte `protobuf:"bytes,5,opt,name=iam_policy_name,json=iamPolicyName,proto3" json:"iam_policy_name,omitempty"`
	// Asset's ancestry path in Cloud Resource Manager (CRM) hierarchy,
	// represented as a list of relative resource names. Ancestry path starts with
	// the closest CRM ancestor and ending at a visible root. If the asset is a
	// CRM project/ folder/organization, this starts from the asset itself.
	//
	// Example: ["projects/123456789", "folders/5432", "organizations/1234"]
	Ancestors            []string `protobuf:"bytes,6,rep,name=ancestors,proto3" json:"ancestors,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Asset) Reset()         { *m = Asset{} }
func (m *Asset) String() string { return proto.CompactTextString(m) }
func (*Asset) ProtoMessage()    {}
func (*Asset) Descriptor() ([]byte, []int) {
	return fileDescriptor_723f69529b7a1cc3, []int{2}
}

func (m *Asset) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Asset.Unmarshal(m, b)
}
func (m *Asset) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Asset.Marshal(b, m, deterministic)
}
func (m *Asset) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Asset.Merge(m, src)
}
func (m *Asset) XXX_Size() int {
	return xxx_messageInfo_Asset.Size(m)
}
func (m *Asset) XXX_DiscardUnknown() {
	xxx_messageInfo_Asset.DiscardUnknown(m)
}

var xxx_messageInfo_Asset proto.InternalMessageInfo

func (m *Asset) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *Asset) GetAssetType() string {
	if m != nil {
		return m.AssetType
	}
	return ""
}

func (m *Asset) GetResource() *Resource {
	if m != nil {
		return m.Resource
	}
	return nil
}

func (m *Asset) GetIamPolicy() *v1.Policy {
	if m != nil {
		return m.IamPolicy
	}
	return nil
}

func (m *Asset) GetIamPolicyName() []byte {
	if m != nil {
		return m.IamPolicyName
	}
	return nil
}

func (m *Asset) GetAncestors() []string {
	if m != nil {
		return m.Ancestors
	}
	return nil
}

// Representation of a cloud resource.
type Resource struct {
	// The API version. Example: "v1".
	Version string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"`
	// The URL of the discovery document containing the resource's JSON schema.
	// For example:
	// `"https://www.googleapis.com/discovery/v1/apis/compute/v1/rest"`.
	// It will be left unspecified for resources without a discovery-based API,
	// such as Cloud Bigtable.
	DiscoveryDocumentUri string `protobuf:"bytes,2,opt,name=discovery_document_uri,json=discoveryDocumentUri,proto3" json:"discovery_document_uri,omitempty"`
	// The JSON schema name listed in the discovery document.
	// Example: "Project". It will be left unspecified for resources (such as
	// Cloud Bigtable) without a discovery-based API.
	DiscoveryName string `protobuf:"bytes,3,opt,name=discovery_name,json=discoveryName,proto3" json:"discovery_name,omitempty"`
	// The REST URL for accessing the resource. An HTTP GET operation using this
	// URL returns the resource itself.
	// Example:
	// `https://cloudresourcemanager.googleapis.com/v1/projects/my-project-123`.
	// It will be left unspecified for resources without a REST API.
	ResourceUrl string `protobuf:"bytes,4,opt,name=resource_url,json=resourceUrl,proto3" json:"resource_url,omitempty"`
	// The full name of the immediate parent of this resource. See
	// [Resource
	// Names](https://cloud.google.com/apis/design/resource_names#full_resource_name)
	// for more information.
	//
	// For GCP assets, it is the parent resource defined in the [Cloud IAM policy
	// hierarchy](https://cloud.google.com/iam/docs/overview#policy_hierarchy).
	// For example:
	// `"//cloudresourcemanager.googleapis.com/projects/my_project_123"`.
	//
	// For third-party assets, it is up to the users to define.
	Parent string `protobuf:"bytes,5,opt,name=parent,proto3" json:"parent,omitempty"`
	// The content of the resource, in which some sensitive fields are scrubbed
	// away and may not be present.
	Data *_struct.Struct `protobuf:"bytes,6,opt,name=data,proto3" json:"data,omitempty"`
	// The actual metadata content for the resource, only visible for internal
	// users.
	InternalData         *any.Any `protobuf:"bytes,7,opt,name=internal_data,json=internalData,proto3" json:"internal_data,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Resource) Reset()         { *m = Resource{} }
func (m *Resource) String() string { return proto.CompactTextString(m) }
func (*Resource) ProtoMessage()    {}
func (*Resource) Descriptor() ([]byte, []int) {
	return fileDescriptor_723f69529b7a1cc3, []int{3}
}

func (m *Resource) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Resource.Unmarshal(m, b)
}
func (m *Resource) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Resource.Marshal(b, m, deterministic)
}
func (m *Resource) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Resource.Merge(m, src)
}
func (m *Resource) XXX_Size() int {
	return xxx_messageInfo_Resource.Size(m)
}
func (m *Resource) XXX_DiscardUnknown() {
	xxx_messageInfo_Resource.DiscardUnknown(m)
}

var xxx_messageInfo_Resource proto.InternalMessageInfo

func (m *Resource) GetVersion() string {
	if m != nil {
		return m.Version
	}
	return ""
}

func (m *Resource) GetDiscoveryDocumentUri() string {
	if m != nil {
		return m.DiscoveryDocumentUri
	}
	return ""
}

func (m *Resource) GetDiscoveryName() string {
	if m != nil {
		return m.DiscoveryName
	}
	return ""
}

func (m *Resource) GetResourceUrl() string {
	if m != nil {
		return m.ResourceUrl
	}
	return ""
}

func (m *Resource) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *Resource) GetData() *_struct.Struct {
	if m != nil {
		return m.Data
	}
	return nil
}

func (m *Resource) GetInternalData() *any.Any {
	if m != nil {
		return m.InternalData
	}
	return nil
}

func init() {
	proto.RegisterType((*TemporalAsset)(nil), "google.cloud.asset.v1p2beta1.TemporalAsset")
	proto.RegisterType((*TimeWindow)(nil), "google.cloud.asset.v1p2beta1.TimeWindow")
	proto.RegisterType((*Asset)(nil), "google.cloud.asset.v1p2beta1.Asset")
	proto.RegisterType((*Resource)(nil), "google.cloud.asset.v1p2beta1.Resource")
}

func init() {
	proto.RegisterFile("google/cloud/asset/v1p2beta1/assets.proto", fileDescriptor_723f69529b7a1cc3)
}

var fileDescriptor_723f69529b7a1cc3 = []byte{
	// 611 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x54, 0x51, 0x6b, 0x13, 0x4d,
	0x14, 0x65, 0xd3, 0x36, 0xcd, 0xde, 0x36, 0xdf, 0x07, 0x43, 0xad, 0x6b, 0x88, 0x18, 0x23, 0x96,
	0x88, 0xb0, 0x4b, 0x6a, 0x7d, 0x28, 0xbe, 0x98, 0x5a, 0xf0, 0x4d, 0xca, 0xd8, 0x22, 0x48, 0x61,
	0x99, 0xee, 0x8e, 0x61, 0x60, 0x77, 0x66, 0x99, 0x99, 0x4d, 0xc9, 0x8b, 0xbf, 0x46, 0x7c, 0xf0,
	0xd9, 0x5f, 0xe1, 0x2f, 0x12, 0x9f, 0x64, 0xef, 0xce, 0xa4, 0xd8, 0x4a, 0x7c, 0xdb, 0x3b, 0xe7,
	0x9c, 0x7b, 0xcf, 0xb9, 0x33, 0x09, 0x3c, 0x9b, 0x2b, 0x35, 0x2f, 0x78, 0x92, 0x15, 0xaa, 0xce,
	0x13, 0x66, 0x0c, 0xb7, 0xc9, 0x62, 0x5a, 0x1d, 0x5e, 0x71, 0xcb, 0xa6, 0x6d, 0x6d, 0xe2, 0x4a,
	0x2b, 0xab, 0xc8, 0xb0, 0xa5, 0xc6, 0x48, 0x8d, 0x11, 0x8a, 0x57, 0xd4, 0x81, 0x43, 0x13, 0x56,
	0x89, 0x84, 0x49, 0xa9, 0x2c, 0xb3, 0x42, 0x49, 0xa7, 0x1d, 0x0c, 0x1c, 0x2a, 0x58, 0x99, 0x2c,
	0xa6, 0x49, 0xa5, 0x0a, 0x91, 0x2d, 0x1d, 0xf6, 0xc0, 0x61, 0x58, 0x5d, 0xd5, 0x9f, 0x12, 0x26,
	0x3d, 0x34, 0xbc, 0x0d, 0x19, 0xab, 0xeb, 0xcc, 0x3a, 0xf4, 0xd1, 0x6d, 0xd4, 0x8a, 0x92, 0x1b,
	0xcb, 0xca, 0xaa, 0x25, 0x8c, 0xbf, 0x06, 0xd0, 0x3f, 0xe7, 0x65, 0xa5, 0x34, 0x2b, 0x66, 0x8d,
	0x5f, 0xf2, 0x1a, 0xba, 0xd7, 0x42, 0xe6, 0xea, 0x3a, 0x0a, 0x46, 0xc1, 0x64, 0xe7, 0x70, 0x12,
	0xaf, 0x0b, 0x15, 0x9f, 0x8b, 0x92, 0x7f, 0x40, 0x3e, 0x75, 0x3a, 0x12, 0xc1, 0x76, 0xce, 0x0b,
	0x6e, 0x79, 0x1e, 0x75, 0x46, 0xc1, 0xa4, 0x47, 0x7d, 0x49, 0x8e, 0x61, 0x0b, 0xf5, 0xd1, 0x06,
	0xb6, 0x7e, 0xb2, 0xbe, 0x35, 0xfa, 0xa1, 0xad, 0x62, 0xfc, 0x19, 0xe0, 0x66, 0x14, 0x39, 0x06,
	0x30, 0x96, 0x69, 0x9b, 0x36, 0x79, 0x9c, 0xd1, 0x81, 0xef, 0xe6, 0xc3, 0xa2, 0x37, 0x0c, 0x4b,
	0x43, 0x64, 0x37, 0x35, 0x79, 0x09, 0x3d, 0x2e, 0xf3, 0x56, 0xd8, 0xf9, 0xa7, 0x70, 0x9b, 0xcb,
	0xbc, 0xa9, 0xc6, 0xbf, 0x02, 0xd8, 0x6a, 0x17, 0x44, 0x60, 0x53, 0x32, 0x37, 0x35, 0xa4, 0xf8,
	0x4d, 0x1e, 0x02, 0xa0, 0xcd, 0xd4, 0x2e, 0xab, 0xb6, 0x6d, 0x48, 0x43, 0x3c, 0x39, 0x5f, 0x56,
	0x9c, 0x9c, 0x40, 0x4f, 0x73, 0xa3, 0x6a, 0x9d, 0x71, 0x17, 0xfd, 0x60, 0x7d, 0x74, 0xea, 0xd8,
	0x74, 0xa5, 0x23, 0x47, 0x00, 0x82, 0x95, 0x69, 0xfb, 0x2e, 0xa2, 0x4d, 0xec, 0x72, 0xcf, 0x77,
	0x11, 0xac, 0x8c, 0x17, 0xd3, 0xf8, 0x0c, 0x41, 0x1a, 0x0a, 0x56, 0xb6, 0x9f, 0xe4, 0x00, 0xfe,
	0xbf, 0x51, 0xa5, 0xe8, 0x7b, 0x6b, 0x14, 0x4c, 0x76, 0x69, 0x7f, 0xc5, 0x79, 0xd7, 0x04, 0x18,
	0x42, 0xc8, 0x64, 0xc6, 0x8d, 0x55, 0xda, 0x44, 0xdd, 0xd1, 0x06, 0xfa, 0xf7, 0x07, 0xe3, 0x2f,
	0x1d, 0xe8, 0x79, 0x4b, 0xcd, 0xf5, 0x2e, 0xb8, 0x36, 0x42, 0x49, 0xb7, 0x02, 0x5f, 0x92, 0x23,
	0xd8, 0xcf, 0x85, 0xc9, 0xd4, 0x82, 0xeb, 0x65, 0x9a, 0xab, 0xac, 0x2e, 0xb9, 0xb4, 0x69, 0xad,
	0x85, 0xdb, 0xc8, 0xde, 0x0a, 0x3d, 0x75, 0xe0, 0x85, 0x16, 0xe4, 0x29, 0xfc, 0x77, 0xa3, 0x42,
	0x87, 0x1b, 0xc8, 0xee, 0xaf, 0x4e, 0xd1, 0xe1, 0x63, 0xd8, 0xf5, 0xbb, 0x48, 0x6b, 0x5d, 0xe0,
	0x06, 0x42, 0xba, 0xe3, 0xcf, 0x2e, 0x74, 0x41, 0xf6, 0xa1, 0x5b, 0x31, 0xcd, 0xa5, 0xc5, 0x8c,
	0x21, 0x75, 0x15, 0x79, 0x0e, 0x9b, 0x39, 0xb3, 0x2c, 0xea, 0xe2, 0xd2, 0xee, 0xdf, 0xb9, 0xee,
	0xf7, 0xf8, 0x93, 0xa1, 0x48, 0x22, 0xc7, 0xd0, 0x17, 0xd2, 0x72, 0x2d, 0x59, 0x91, 0xa2, 0x6a,
	0x1b, 0x55, 0x7b, 0x77, 0x54, 0x33, 0xb9, 0xa4, 0xbb, 0x9e, 0x7a, 0xca, 0x2c, 0x3b, 0xf9, 0x1e,
	0xc0, 0x28, 0x53, 0xe5, 0xda, 0xab, 0x3d, 0x01, 0x7c, 0x45, 0x67, 0x4d, 0x97, 0xb3, 0xe0, 0xe3,
	0xcc, 0x71, 0xe7, 0xaa, 0x60, 0x72, 0x1e, 0x2b, 0x3d, 0x4f, 0xe6, 0x5c, 0xe2, 0x8c, 0xa4, 0x85,
	0x58, 0x25, 0xcc, 0xdf, 0xff, 0x7b, 0x5e, 0x61, 0xfd, 0x33, 0x08, 0xbe, 0x75, 0x86, 0x6f, 0xdb,
	0x36, 0x6f, 0x70, 0xe4, 0xec, 0xcf, 0x91, 0x3f, 0x3c, 0x7c, 0x89, 0xf0, 0x25, 0xc2, 0x97, 0x2b,
	0xf8, 0xaa, 0x8b, 0xe3, 0x5e, 0xfc, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x1c, 0xff, 0x70, 0xd9, 0xe9,
	0x04, 0x00, 0x00,
}
