本文整理汇总了Golang中k8s/io/kubernetes/pkg/api/unversioned.NewTime函数的典型用法代码示例。如果您正苦于以下问题:Golang NewTime函数的具体用法?Golang NewTime怎么用?Golang NewTime使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了NewTime函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Golang代码示例。
示例1: WriteConfig
func WriteConfig(stateStore fi.StateStore, cluster *Cluster, groups []*InstanceGroup) error {
// Check for instancegroup Name duplicates before writing
{
names := map[string]bool{}
for i, ns := range groups {
if ns.Name == "" {
return fmt.Errorf("InstanceGroup #%d did not have a Name", i+1)
}
if names[ns.Name] {
return fmt.Errorf("Duplicate InstanceGroup Name found: %q", ns.Name)
}
names[ns.Name] = true
}
}
if cluster.CreationTimestamp.IsZero() {
cluster.CreationTimestamp = unversioned.NewTime(time.Now().UTC())
}
err := stateStore.WriteConfig("config", cluster)
if err != nil {
return fmt.Errorf("error writing updated cluster configuration: %v", err)
}
for _, ns := range groups {
if ns.CreationTimestamp.IsZero() {
ns.CreationTimestamp = unversioned.NewTime(time.Now().UTC())
}
err = stateStore.WriteConfig("instancegroup/"+ns.Name, ns)
if err != nil {
return fmt.Errorf("error writing updated instancegroup configuration: %v", err)
}
}
return nil
}
开发者ID:crohling,项目名称:kops,代码行数:34,代码来源:registry.go
示例2: TestStoreMultipleDataInput
func TestStoreMultipleDataInput(t *testing.T) {
fakeSink := NewFakeSink()
timestamp := time.Now()
now := time.Now()
event1 := kube_api.Event{
Message: "event1",
Count: 100,
LastTimestamp: kube_api_unversioned.NewTime(now),
FirstTimestamp: kube_api_unversioned.NewTime(now),
}
event2 := kube_api.Event{
Message: "event2",
Count: 101,
LastTimestamp: kube_api_unversioned.NewTime(now),
FirstTimestamp: kube_api_unversioned.NewTime(now),
}
data := core.EventBatch{
Timestamp: timestamp,
Events: []*kube_api.Event{
&event1,
&event2,
},
}
fakeSink.ExportEvents(&data)
assert.Equal(t, 2, len(fakeSink.fakeDbClient.Pnts))
}
开发者ID:titilambert,项目名称:heapster,代码行数:30,代码来源:influxdb_test.go
示例3: containerStatusToAPIContainerStatus
// convert ContainerStatus to api.ContainerStatus.
func containerStatusToAPIContainerStatus(containerStatus *kubecontainer.ContainerStatus) *api.ContainerStatus {
containerID := DockerPrefix + containerStatus.ID.ID
status := api.ContainerStatus{
Name: containerStatus.Name,
RestartCount: containerStatus.RestartCount,
Image: containerStatus.Image,
ImageID: containerStatus.ImageID,
ContainerID: containerID,
}
switch containerStatus.State {
case kubecontainer.ContainerStateRunning:
status.State.Running = &api.ContainerStateRunning{StartedAt: unversioned.NewTime(containerStatus.StartedAt)}
case kubecontainer.ContainerStateExited:
status.State.Terminated = &api.ContainerStateTerminated{
ExitCode: containerStatus.ExitCode,
Reason: containerStatus.Reason,
Message: containerStatus.Message,
StartedAt: unversioned.NewTime(containerStatus.StartedAt),
FinishedAt: unversioned.NewTime(containerStatus.FinishedAt),
ContainerID: containerID,
}
default:
status.State.Waiting = &api.ContainerStateWaiting{}
}
return &status
}
开发者ID:parkish,项目名称:kubernetes,代码行数:27,代码来源:convert.go
示例4: getNodeMetrics
func (a *Api) getNodeMetrics(node string) *v1alpha1.NodeMetrics {
batch := a.metricSink.GetLatestDataBatch()
if batch == nil {
return nil
}
ms, found := batch.MetricSets[core.NodeKey(node)]
if !found {
return nil
}
usage, err := parseResourceList(ms)
if err != nil {
return nil
}
return &v1alpha1.NodeMetrics{
ObjectMeta: kube_v1.ObjectMeta{
Name: node,
CreationTimestamp: kube_unversioned.NewTime(time.Now()),
},
Timestamp: kube_unversioned.NewTime(batch.Timestamp),
Window: kube_unversioned.Duration{Duration: time.Minute},
Usage: usage,
}
}
开发者ID:mwringe,项目名称:heapster,代码行数:26,代码来源:handlers.go
示例5: getContainerStatus
func (r *runtime) getContainerStatus(container ContainerStatus, image, imageID string) api.ContainerStatus {
var status api.ContainerStatus
_, _, _, containerName, _, err := r.parseHyperContainerFullName(container.Name)
if err != nil {
return status
}
status.Name = strings.Split(containerName, ".")[0]
status.ContainerID = r.buildContainerID(container.ContainerID)
status.Image = image
status.ImageID = imageID
switch container.Phase {
case StatusRunning:
runningStartedAt, err := parseTimeString(container.Running.StartedAt)
if err != nil {
glog.Errorf("Hyper: can't parse runningStartedAt %s", container.Running.StartedAt)
return status
}
status.State = api.ContainerState{
Running: &api.ContainerStateRunning{
StartedAt: unversioned.NewTime(runningStartedAt),
},
}
case StatusPending:
status.State = api.ContainerState{
Waiting: &api.ContainerStateWaiting{
Reason: container.Waiting.Reason,
},
}
case StatusFailed, StatusSuccess:
terminatedStartedAt, err := parseTimeString(container.Terminated.StartedAt)
if err != nil {
glog.Errorf("Hyper: can't parse terminatedStartedAt %s", container.Terminated.StartedAt)
return status
}
terminatedFinishedAt, err := parseTimeString(container.Terminated.FinishedAt)
if err != nil {
glog.Errorf("Hyper: can't parse terminatedFinishedAt %s", container.Terminated.FinishedAt)
return status
}
status.State = api.ContainerState{
Terminated: &api.ContainerStateTerminated{
ExitCode: container.Terminated.ExitCode,
Reason: container.Terminated.Reason,
Message: container.Terminated.Message,
StartedAt: unversioned.NewTime(terminatedStartedAt),
FinishedAt: unversioned.NewTime(terminatedFinishedAt),
},
}
default:
glog.Warningf("Hyper: Unknown pod state: %q", container.Phase)
}
return status
}
开发者ID:kuenzaa,项目名称:hypernetes,代码行数:60,代码来源:hyper.go
示例6: getPodMetrics
func (m *MetricStorage) getPodMetrics(pod *api.Pod) *metrics.PodMetrics {
batch := m.metricSink.GetLatestDataBatch()
if batch == nil {
return nil
}
res := &metrics.PodMetrics{
ObjectMeta: api.ObjectMeta{
Name: pod.Name,
Namespace: pod.Namespace,
CreationTimestamp: unversioned.NewTime(time.Now()),
},
Timestamp: unversioned.NewTime(batch.Timestamp),
Window: unversioned.Duration{Duration: time.Minute},
Containers: make([]metrics.ContainerMetrics, 0),
}
for _, c := range pod.Spec.Containers {
ms, found := batch.MetricSets[core.PodContainerKey(pod.Namespace, pod.Name, c.Name)]
if !found {
glog.Infof("No metrics for container %s in pod %s/%s", c.Name, pod.Namespace, pod.Name)
return nil
}
usage, err := util.ParseResourceList(ms)
if err != nil {
return nil
}
res.Containers = append(res.Containers, metrics.ContainerMetrics{Name: c.Name, Usage: usage})
}
return res
}
开发者ID:kubernetes,项目名称:heapster,代码行数:32,代码来源:reststorage.go
示例7: getNodeMetrics
func (m *MetricStorage) getNodeMetrics(node string) *metrics.NodeMetrics {
batch := m.metricSink.GetLatestDataBatch()
if batch == nil {
return nil
}
ms, found := batch.MetricSets[core.NodeKey(node)]
if !found {
return nil
}
usage, err := util.ParseResourceList(ms)
if err != nil {
return nil
}
return &metrics.NodeMetrics{
ObjectMeta: api.ObjectMeta{
Name: node,
CreationTimestamp: unversioned.NewTime(time.Now()),
},
Timestamp: unversioned.NewTime(batch.Timestamp),
Window: unversioned.Duration{Duration: time.Minute},
Usage: usage,
}
}
开发者ID:kubernetes,项目名称:heapster,代码行数:26,代码来源:reststorage.go
示例8: BeforeDelete
// BeforeDelete tests whether the object can be gracefully deleted. If graceful is set the object
// should be gracefully deleted, if gracefulPending is set the object has already been gracefully deleted
// (and the provided grace period is longer than the time to deletion), and an error is returned if the
// condition cannot be checked or the gracePeriodSeconds is invalid. The options argument may be updated with
// default values if graceful is true. Second place where we set deletionTimestamp is pkg/registry/generic/registry/store.go
// this function is responsible for setting deletionTimestamp during gracefulDeletion, other one for cascading deletions.
func BeforeDelete(strategy RESTDeleteStrategy, ctx api.Context, obj runtime.Object, options *api.DeleteOptions) (graceful, gracefulPending bool, err error) {
objectMeta, gvk, kerr := objectMetaAndKind(strategy, obj)
if kerr != nil {
return false, false, kerr
}
// Checking the Preconditions here to fail early. They'll be enforced later on when we actually do the deletion, too.
if options.Preconditions != nil && options.Preconditions.UID != nil && *options.Preconditions.UID != objectMeta.UID {
return false, false, errors.NewConflict(schema.GroupResource{Group: gvk.Group, Resource: gvk.Kind}, objectMeta.Name, fmt.Errorf("the UID in the precondition (%s) does not match the UID in record (%s). The object might have been deleted and then recreated", *options.Preconditions.UID, objectMeta.UID))
}
gracefulStrategy, ok := strategy.(RESTGracefulDeleteStrategy)
if !ok {
// If we're not deleting gracefully there's no point in updating Generation, as we won't update
// the obcject before deleting it.
return false, false, nil
}
// if the object is already being deleted, no need to update generation.
if objectMeta.DeletionTimestamp != nil {
// if we are already being deleted, we may only shorten the deletion grace period
// this means the object was gracefully deleted previously but deletionGracePeriodSeconds was not set,
// so we force deletion immediately
if objectMeta.DeletionGracePeriodSeconds == nil {
return false, false, nil
}
// only a shorter grace period may be provided by a user
if options.GracePeriodSeconds != nil {
period := int64(*options.GracePeriodSeconds)
if period >= *objectMeta.DeletionGracePeriodSeconds {
return false, true, nil
}
newDeletionTimestamp := unversioned.NewTime(
objectMeta.DeletionTimestamp.Add(-time.Second * time.Duration(*objectMeta.DeletionGracePeriodSeconds)).
Add(time.Second * time.Duration(*options.GracePeriodSeconds)))
objectMeta.DeletionTimestamp = &newDeletionTimestamp
objectMeta.DeletionGracePeriodSeconds = &period
return true, false, nil
}
// graceful deletion is pending, do nothing
options.GracePeriodSeconds = objectMeta.DeletionGracePeriodSeconds
return false, true, nil
}
if !gracefulStrategy.CheckGracefulDelete(ctx, obj, options) {
return false, false, nil
}
now := unversioned.NewTime(unversioned.Now().Add(time.Second * time.Duration(*options.GracePeriodSeconds)))
objectMeta.DeletionTimestamp = &now
objectMeta.DeletionGracePeriodSeconds = options.GracePeriodSeconds
// If it's the first graceful deletion we are going to set the DeletionTimestamp to non-nil.
// Controllers of the object that's being deleted shouldn't take any nontrivial actions, hence its behavior changes.
// Thus we need to bump object's Generation (if set). This handles generation bump during graceful deletion.
// The bump for objects that don't support graceful deletion is handled in pkg/registry/generic/registry/store.go.
if objectMeta.Generation > 0 {
objectMeta.Generation++
}
return true, false, nil
}
开发者ID:paralin,项目名称:kubernetes,代码行数:62,代码来源:delete.go
示例9: TestBuildDecorator
func TestBuildDecorator(t *testing.T) {
build := &buildapi.Build{
ObjectMeta: kapi.ObjectMeta{Name: "buildid", Namespace: "default"},
Spec: buildapi.BuildSpec{
Source: buildapi.BuildSource{
Git: &buildapi.GitBuildSource{
URI: "http://github.com/my/repository",
},
ContextDir: "context",
},
Strategy: buildapi.BuildStrategy{
DockerStrategy: &buildapi.DockerBuildStrategy{},
},
Output: buildapi.BuildOutput{
To: &kapi.ObjectReference{
Kind: "DockerImage",
Name: "repository/data",
},
},
},
Status: buildapi.BuildStatus{
Phase: buildapi.BuildPhaseNew,
},
}
now := unversioned.Now()
startTime := unversioned.NewTime(now.Time.Add(-1 * time.Minute))
build.Status.StartTimestamp = &startTime
err := Decorator(build)
if err != nil {
t.Errorf("Unexpected error decorating build")
}
if build.Status.Duration <= 0 {
t.Errorf("Build duration should be greater than zero")
}
}
开发者ID:RomainVabre,项目名称:origin,代码行数:35,代码来源:strategy_test.go
示例10: containerInfoV2ToNetworkStats
func (sb *summaryBuilder) containerInfoV2ToNetworkStats(info *cadvisorapiv2.ContainerInfo) *stats.NetworkStats {
if !info.Spec.HasNetwork {
return nil
}
cstat, found := sb.latestContainerStats(info)
if !found {
return nil
}
var (
rxBytes uint64
rxErrors uint64
txBytes uint64
txErrors uint64
)
// TODO(stclair): check for overflow
for _, inter := range cstat.Network.Interfaces {
rxBytes += inter.RxBytes
rxErrors += inter.RxErrors
txBytes += inter.TxBytes
txErrors += inter.TxErrors
}
return &stats.NetworkStats{
Time: unversioned.NewTime(cstat.Timestamp),
RxBytes: &rxBytes,
RxErrors: &rxErrors,
TxBytes: &txBytes,
TxErrors: &txErrors,
}
}
开发者ID:ethernetdan,项目名称:kubernetes,代码行数:29,代码来源:summary.go
示例11: TestGracefulStoreCanDeleteIfExistingGracePeriodZero
// TestGracefulStoreCanDeleteIfExistingGracePeriodZero tests recovery from
// race condition where the graceful delete is unable to complete
// in prior operation, but the pod remains with deletion timestamp
// and grace period set to 0.
func TestGracefulStoreCanDeleteIfExistingGracePeriodZero(t *testing.T) {
deletionTimestamp := unversioned.NewTime(time.Now())
deletionGracePeriodSeconds := int64(0)
initialGeneration := int64(1)
pod := &api.Pod{
ObjectMeta: api.ObjectMeta{
Name: "foo",
Generation: initialGeneration,
DeletionGracePeriodSeconds: &deletionGracePeriodSeconds,
DeletionTimestamp: &deletionTimestamp,
},
Spec: api.PodSpec{NodeName: "machine"},
}
testContext := api.WithNamespace(api.NewContext(), "test")
destroyFunc, registry := NewTestGenericStoreRegistry(t)
defaultDeleteStrategy := testRESTStrategy{api.Scheme, api.SimpleNameGenerator, true, false, true}
registry.DeleteStrategy = testGracefulStrategy{defaultDeleteStrategy}
defer destroyFunc()
graceful, gracefulPending, err := rest.BeforeDelete(registry.DeleteStrategy, testContext, pod, api.NewDeleteOptions(0))
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
if graceful {
t.Fatalf("graceful should be false if object has DeletionTimestamp and DeletionGracePeriodSeconds is 0")
}
if gracefulPending {
t.Fatalf("gracefulPending should be false if object has DeletionTimestamp and DeletionGracePeriodSeconds is 0")
}
}
开发者ID:dcbw,项目名称:origin,代码行数:35,代码来源:store_test.go
示例12: containerInfoV2ToStats
func (sb *summaryBuilder) containerInfoV2ToStats(
name string,
info *cadvisorapiv2.ContainerInfo) ContainerStats {
stats := ContainerStats{
Name: name,
StartTime: unversioned.NewTime(info.Spec.CreationTime),
}
cstat, found := sb.latestContainerStats(info)
if !found {
return stats
}
if info.Spec.HasCpu {
cpuStats := CPUStats{}
if cstat.CpuInst != nil {
cpuStats.UsageNanoCores = &cstat.CpuInst.Usage.Total
}
if cstat.Cpu != nil {
cpuStats.UsageCoreNanoSeconds = &cstat.Cpu.Usage.Total
}
stats.CPU = &cpuStats
}
if info.Spec.HasMemory {
pageFaults := cstat.Memory.ContainerData.Pgfault
majorPageFaults := cstat.Memory.ContainerData.Pgmajfault
stats.Memory = &MemoryStats{
UsageBytes: &cstat.Memory.Usage,
WorkingSetBytes: &cstat.Memory.WorkingSet,
PageFaults: &pageFaults,
MajorPageFaults: &majorPageFaults,
}
}
sb.containerInfoV2FsStats(info, &stats)
stats.UserDefinedMetrics = sb.containerInfoV2ToUserDefinedMetrics(info)
return stats
}
开发者ID:richm,项目名称:origin,代码行数:35,代码来源:summary.go
示例13: TestFilterBeforePredicate
func TestFilterBeforePredicate(t *testing.T) {
youngerThan := time.Hour
now := unversioned.Now()
old := unversioned.NewTime(now.Time.Add(-1 * youngerThan))
builds := []*buildapi.Build{
{
ObjectMeta: kapi.ObjectMeta{
Name: "old",
CreationTimestamp: old,
},
},
{
ObjectMeta: kapi.ObjectMeta{
Name: "new",
CreationTimestamp: now,
},
},
}
filter := &andFilter{
filterPredicates: []FilterPredicate{NewFilterBeforePredicate(youngerThan)},
}
result := filter.Filter(builds)
if len(result) != 1 {
t.Errorf("Unexpected number of results")
}
if expected, actual := "old", result[0].Name; expected != actual {
t.Errorf("expected %v, actual %v", expected, actual)
}
}
开发者ID:RomainVabre,项目名称:origin,代码行数:29,代码来源:data_test.go
示例14: TestNodeConditionsObservedSince
func TestNodeConditionsObservedSince(t *testing.T) {
now := unversioned.Now()
observedTime := unversioned.NewTime(now.Time.Add(-1 * time.Minute))
testCases := map[string]struct {
observedAt nodeConditionsObservedAt
period time.Duration
now time.Time
result []api.NodeConditionType
}{
"in-period": {
observedAt: nodeConditionsObservedAt{
api.NodeMemoryPressure: observedTime.Time,
},
period: 2 * time.Minute,
now: now.Time,
result: []api.NodeConditionType{api.NodeMemoryPressure},
},
"out-of-period": {
observedAt: nodeConditionsObservedAt{
api.NodeMemoryPressure: observedTime.Time,
},
period: 30 * time.Second,
now: now.Time,
result: []api.NodeConditionType{},
},
}
for testName, testCase := range testCases {
actual := nodeConditionsObservedSince(testCase.observedAt, testCase.period, testCase.now)
if !nodeConditionList(actual).Equal(nodeConditionList(testCase.result)) {
t.Errorf("Test case: %s, expected: %v, actual: %v", testName, testCase.result, actual)
}
}
}
开发者ID:odacremolbap,项目名称:kubernetes,代码行数:33,代码来源:helpers_test.go
示例15: buildSummaryPods
// buildSummaryPods aggregates and returns the container stats in cinfos by the Pod managing the container.
// Containers not managed by a Pod are omitted.
func (sb *summaryBuilder) buildSummaryPods() []PodStats {
// Map each container to a pod and update the PodStats with container data
podToStats := map[PodReference]*PodStats{}
for _, cinfo := range sb.infos {
// Build the Pod key if this container is managed by a Pod
if !sb.isPodManagedContainer(&cinfo) {
continue
}
ref := sb.buildPodRef(&cinfo)
// Lookup the PodStats for the pod using the PodRef. If none exists, initialize a new entry.
stats, found := podToStats[ref]
if !found {
stats = &PodStats{PodRef: ref}
podToStats[ref] = stats
}
// Update the PodStats entry with the stats from the container by adding it to stats.Containers
containerName := dockertools.GetContainerName(cinfo.Spec.Labels)
if containerName == leaky.PodInfraContainerName {
// Special case for infrastructure container which is hidden from the user and has network stats
stats.Network = sb.containerInfoV2ToNetworkStats(&cinfo)
stats.StartTime = unversioned.NewTime(cinfo.Spec.CreationTime)
} else {
stats.Containers = append(stats.Containers, sb.containerInfoV2ToStats(containerName, &cinfo))
}
}
// Add each PodStats to the result
result := make([]PodStats, 0, len(podToStats))
for _, stats := range podToStats {
result = append(result, *stats)
}
return result
}
开发者ID:sjtud,项目名称:kubernetes,代码行数:37,代码来源:summary.go
示例16: NewFilterBeforePredicate
// NewFilterBeforePredicate is a function that returns true if the build was created before the current time minus specified duration
func NewFilterBeforePredicate(d time.Duration) FilterPredicate {
now := unversioned.Now()
before := unversioned.NewTime(now.Time.Add(-1 * d))
return func(item *kapi.ReplicationController) bool {
return item.CreationTimestamp.Before(before)
}
}
开发者ID:RomainVabre,项目名称:origin,代码行数:8,代码来源:data.go
示例17: NewFilterBeforePredicate
// NewFilterBeforePredicate is a function that returns true if the build was created before the current time minus specified duration
func NewFilterBeforePredicate(d time.Duration) FilterPredicate {
now := unversioned.Now()
before := unversioned.NewTime(now.Time.Add(-1 * d))
return func(build *buildapi.Build) bool {
return build.CreationTimestamp.Before(before)
}
}
开发者ID:RomainVabre,项目名称:origin,代码行数:8,代码来源:data.go
示例18: sizedImage
func sizedImage(id, ref string, size int64) imageapi.Image {
image := imageWithLayers(id, ref, false, layer1, layer2, layer3, layer4, layer5)
image.CreationTimestamp = unversioned.NewTime(unversioned.Now().Add(time.Duration(-1) * time.Minute))
image.DockerImageMetadata.Size = size
return image
}
开发者ID:legionus,项目名称:origin,代码行数:7,代码来源:prune_test.go
示例19: TestScrapeSummaryMetrics
func TestScrapeSummaryMetrics(t *testing.T) {
summary := stats.Summary{
Node: stats.NodeStats{
NodeName: nodeInfo.NodeName,
StartTime: unversioned.NewTime(startTime),
},
}
data, err := json.Marshal(&summary)
require.NoError(t, err)
server := httptest.NewServer(&util.FakeHandler{
StatusCode: 200,
ResponseBody: string(data),
T: t,
})
defer server.Close()
ms := testingSummaryMetricsSource()
split := strings.SplitN(strings.Replace(server.URL, "http://", "", 1), ":", 2)
ms.node.IP = split[0]
ms.node.Port, err = strconv.Atoi(split[1])
require.NoError(t, err)
res := ms.ScrapeMetrics(time.Now(), time.Now())
assert.Equal(t, res.MetricSets["node:test"].Labels[core.LabelMetricSetType.Key], core.MetricSetTypeNode)
}
开发者ID:kubernetes,项目名称:heapster,代码行数:26,代码来源:summary_test.go
示例20: TestSort
// TestSort verifies that builds are sorted by most recently created
func TestSort(t *testing.T) {
present := unversioned.Now()
past := unversioned.NewTime(present.Time.Add(-1 * time.Minute))
controllers := []*kapi.ReplicationController{
{
ObjectMeta: kapi.ObjectMeta{
Name: "past",
CreationTimestamp: past,
},
},
{
ObjectMeta: kapi.ObjectMeta{
Name: "present",
CreationTimestamp: present,
},
},
}
sort.Sort(sortableReplicationControllers(controllers))
if controllers[0].Name != "present" {
t.Errorf("Unexpected sort order")
}
if controllers[1].Name != "past" {
t.Errorf("Unexpected sort order")
}
}
开发者ID:hloganathan,项目名称:origin,代码行数:26,代码来源:sort_test.go
注:本文中的k8s/io/kubernetes/pkg/api/unversioned.NewTime函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论